Loading the Packages
library(pacman)
p_load(tidyverse, haven,sjmisc,
forcats, weights, car,
countrycode, lavaan,
semTools, lavaan.survey,
survey, reshape2, favstats)
Loading the URLs
afro5_url <-url('https://github.com/favstats/database_delib/raw//master/afro5.RData')
afro6_url <-url('https://github.com/favstats/database_delib/raw//master/afro6.RData')
latino2013_url <-url('https://github.com/favstats/database_delib/raw//master/latino2013.RData')
latino2015_url <-url('https://github.com/favstats/database_delib/raw//master/latino2015.RData')
wvs_raw_url <-url('https://github.com/favstats/database_delib/raw//master/wvs_raw.RData')
americas_url <-url('https://github.com/favstats/database_delib/raw//master/americas.RData')
bolivia_url <-url('https://github.com/favstats/database_delib/raw//master/bolivia.RData')
canada_url <-url('https://github.com/favstats/database_delib/raw//master/canada.RData')
asian_raw_url <-url('https://github.com/favstats/database_delib/raw//master/asian_raw.RData')
myanmar_raw_url <-url('https://github.com/favstats/database_delib/raw//master/myanmar_raw.RData')
mongolia_raw_url <-url('https://github.com/favstats/database_delib/raw//master/mongolia_raw.RData')
philip_raw_url <-url('https://github.com/favstats/database_delib/raw//master/philip_raw.RData')
taiwan_raw_url <-url('https://github.com/favstats/database_delib/raw//master/taiwan_raw.RData')
thai_raw_url <-url('https://github.com/favstats/database_delib/raw//master/thai_raw.RData')
malay_raw_url <-url('https://github.com/favstats/database_delib/raw//master/malay_raw.RData')
singapore_raw_url<-url('https://github.com/favstats/database_delib/raw//master/singapore_raw.RData')
sk_raw_url <-url('https://github.com/favstats/database_delib/raw//master/sk_raw.RData')
cambodia_raw_url <-url('https://github.com/favstats/database_delib/raw//master/cambodia_raw.RData')
ESS_raw_url <-url('https://github.com/favstats/database_delib/blob/master/ESS_raw.Rdata?raw=true')
vdems_start_url <-url('https://github.com/favstats/database_delib/raw//master/vdems_start.Rdata')
qog_url <-url('https://github.com/favstats/database_delib/raw//master/qog.Rdata')
Afrobarometer Data
Afro 5
load(afro5_url)
delete_na_afro <- function(x) {
x<-Recode(x, "9 = NA;
98 = NA;
99 = NA;
-1 = NA")
return(x)
} #Funktion um die NAs im Afro Datensatz zu bestimmen
# alle Variablen
afro_5 <- afro5 %>%
rename(educ = Q97, #Variablen umbenennen
income = Q3B,
sex = Q101,
work = Q96,
trust_gov = Q59A,
trust_parliament = Q59B,
trust_police = Q59H,
trust_courts = Q59J,
demtoday = Q46A) %>%
mutate_at(vars(income, trust_gov, trust_parliament,
trust_police, trust_courts, work),
delete_na_afro) %>% #NAs deleten
mutate(sex = sex - 1, #sex (0/1) codieren
work = Recode(work, #work (0/1) codieren
"1 = 0;
2 = 1;
3 = 1"),
age = Recode(Q1, #missing values l?schen
"-1 = NA;
998 = NA;
999 = NA"),
demtoday = Recode(demtoday,
"-1 = NA;
98 = NA;
99 = NA"),
educ = Recode(educ,
"-1 = NA;
98 = NA;
99 = NA;
999 = NA"),
cntry = to_label(COUNTRY_ALPHA),
year = as.numeric(format(DATEINTR,'%Y'))) %>%
select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
afro_5
Afro 6
load(afro6_url)
afro_6 <- afro6 %>%
rename(educ = Q97,
income = Q4B,
sex = Q101,
work = Q95,
trust_gov = Q52A,
trust_parliament = Q52B,
trust_police = Q52H,
trust_courts = Q52J,
demtoday = Q40)%>%
mutate_at(vars(income, demtoday, trust_gov,
trust_parliament, trust_police,
trust_courts, work),
delete_na_afro) %>% #NAs deleten
mutate(sex = sex - 1, #sex (0/1) codieren
work = Recode(work, #work (0/1) codieren
"1 = 0;
2 = 1;
3 = 1"),
age = Recode(Q1, #missing values l?schen
"-1 = NA;
998 = NA;
999 = NA"),
educ = Recode(educ,
"-1 = NA;
98 = NA;
99 = NA;
999 = NA"),
demtoday = Recode(demtoday,
"8 = NA"),
cntry = to_label(COUNTRY_R5List),
year = as.numeric(format(DATEINTR,'%Y'))) %>%
select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
afro_6
Merging the Data
afro_real <- afro_5 %>% select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
afro_real2 <- afro_6 %>% select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
#length(unique(afro_real$cntry))
#length(unique(afro_real2$cntry))
#table(afro_real2$year)
afro <- rbind(afro_real,afro_real2) %>% as.tbl()
afro
Latino Barometro
Latino 2013
load(latino2013_url)
latino_2013 <-latino2013 %>%
rename(educ = REEDUC_1,
income = S6,
demtoday = P50TGB.A,
age = S11) %>%
mutate(sex = S10 - 1, #sex variable erstellen
cntry = to_label(IDENPA), #cntry variable erstellen
trust_gov = 5-P26TGB.B,
trust_parliament = 5-P26TGB.C,
trust_police = 5-P28TGB.B,
trust_courts = 5-P26TGB.E,
year = 2013,
income = 5 - income,
work = Recode(S19.A,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0")) %>%
select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts) %>%
# mutate_at(vars(income, demtoday, educ,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
latino_2013
Latino 2015
load(latino2015_url)
latino_2015 <-latino2015 %>%
mutate(sex = S12 - 1) %>% #sex variable erstellen
rename(educ = REEDUC_1,
income = S4,
demtoday = P17STGBS,
age = S13) %>%
mutate(trust_gov = 5-P16ST.G,
trust_parliament = 5-P16ST.F,
trust_police = 5-P16TGB.B,
trust_courts = 5-P16ST.H,
work = Recode(S21.A,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0"),
cntry = to_label(IDENPA),
income = 5 - income,
year = 2015) %>%
select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts) %>%
# mutate_at(vars(income, demtoday, educ,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
latino_2015
Merging the Data
latino_real <- latino_2013 %>% select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
latino_real2 <- latino_2015 %>% select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
#length(unique(afro_real$cntry))
#length(unique(afro_real2$cntry))
#table(afro_real2$year)
latino <- rbind(latino_real,latino_real2) %>% as.tbl()
latino
World Value Survey
load(wvs_raw_url)
wvs <-wvs_raw %>%
rename(educ = V248,
income = V239,
demtoday = V141,
age = V242,
year = V262) %>%
mutate(sex = V240 -1, #sex variable erstellen
trust_gov = 5-V115,
trust_parliament = 5-V117,
trust_police = 5-V113,
trust_courts = 5-V114,
work = Recode(V229,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0;
8 = 0"),
cntry = to_label(V2)) %>%
select(cntry,year,age,sex, income, educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
as.character) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
wvs
Americas Barometer
Americas Main
load(americas_url)
americas_ <- americas %>%
mutate(cntry = to_label(pais)) %>%
select(cntry, ocup4a, ed, q10new, q1, q2,
b10a, b13, b18, b21a, n3, year) %>%
rename(work = ocup4a,
educ = ed,
income = q10new,
sex = q1,
age = q2,
trust_courts = b10a,
trust_parliament = b13,
trust_police = b18,
trust_gov = b21a,
demtoday = n3) %>%
mutate(sex = sex -1, #sex variable erstellen
work = Recode(work,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0")) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
americas_
Bolivia
load(bolivia_url)
bolivia_ <- bolivia %>%
mutate(cntry = to_label(pais)) %>%
select(cntry, ocup4a, ed, q10new, q1, q2,
b10a, b13, b18, b21a, n3, year) %>%
rename(work = ocup4a,
educ = ed,
income = q10new,
sex = q1,
age = q2,
trust_courts = b10a,
trust_parliament = b13,
trust_police = b18,
trust_gov = b21a, #viele missing values
demtoday = n3) %>%
mutate(sex = sex -1, #sex variable erstellen
work = Recode(work,
"2 = 1;
3 = 1;
4 = 0;
5 = 0;
6 = 0;
7 = 0")) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
bolivia_
Canada
load(canada_url)
canada_ <- canada %>%
mutate(cntry = to_label(pais)) %>%
select(cntry, exc13, education, q10, q1, q2,
b10a, b13, b18, b21a, n3, year) %>%
rename(work = exc13,
educ = education,
income = q10,
sex = q1,
age = q2,
trust_courts = b10a,
trust_parliament = b13,
trust_police = b18,
trust_gov = b21a,
demtoday = n3) %>%
mutate(sex = sex -1, #sex variable erstellen
work = work - 1,
income = ifelse(income == 88, NA, income)) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
canada_
Merging the Data
americas <- americas_ %>% dplyr::select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
bolivia <- bolivia_ %>% dplyr::select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
canada <- canada_ %>% dplyr::select(cntry,year,
educ,income,sex,age,work,
demtoday,trust_gov, trust_parliament,
trust_police,trust_courts)
americas <- rbind(americas,bolivia,canada)
americas
Asian Barometer
load(asian_raw_url)
delete_na_asian <- function(x) {
x<-Recode(x,
"-2 = NA;
7 = NA;
8 = NA;
9 = NA;
97 = NA;
98 = NA;
99 = NA;
-1 = NA")
return(x)
} #Funktion um die NAs im asian Datensatz zu bestimmen
asian_3 <- asian_raw %>%
rename(educ = se5,
trust_gov = q9,
trust_parliament = q11,
trust_police = q14,
trust_courts = q8,
sex = se2,
income = se13a,
work = se9) %>%
mutate_at(vars(income, trust_gov, trust_parliament,
trust_police, trust_courts, work, sex),
delete_na_asian) %>% #NAs deleten
mutate(trust_gov = 5 - trust_gov,
trust_parliament = 5 - trust_parliament,
trust_police = 5 - trust_police,
trust_courts = 5 - trust_courts,
sex = sex - 1, #sex (0/1) codieren
income = Recode(income,
"0 = NA"),
income = 5 - income,
work = Recode(work, #work (0/1) codieren
"2 = 0"),
age = Recode(se3a, #missing values l?schen
"-1 = NA"),
demtoday = Recode(q91,
"-1 = NA;
97 = NA;
98 = NA;
99 = NA"),
educ = Recode(educ,
"-1 = NA;
98 = NA;
99 = NA"),
cntry = to_label(country),
year = as.numeric(format(ir9,'%Y'))) %>%
select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
asian_3
Wave 4
load(myanmar_raw_url)
needed <- function (data) {
ss <- data %>%
rename(educ = se5,
trust_gov = q9,
trust_parliament = q11,
trust_police = q14,
trust_courts = q8,
sex = se2,
income = se13a,
work = se9) %>%
mutate_at(vars(income, trust_gov, trust_parliament,
trust_police, trust_courts, work, sex),
delete_na_asian) %>% #NAs deleten
mutate(trust_gov = 5 - trust_gov,
trust_parliament = 5 - trust_parliament,
trust_police = 5 - trust_police,
trust_courts = 5 - trust_courts,
sex = sex - 1, #sex (0/1) codieren
income = Recode(income,
"0 = NA"),
work = Recode(work, #work (0/1) codieren
"2 = 0"),
age = Recode(se3_2, #missing values l?schen
"-1 = NA"),
demtoday = Recode(q94,
"-1 = NA;
97 = NA;
98 = NA;
99 = NA"),
educ = Recode(educ,
"-1 = NA;
98 = NA;
99 = NA"),
cntry = to_label(country),
year = year) %>%
select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ, age,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
return(ss)
}
myanmar <- needed(myanmar_raw)
load(mongolia_raw_url)
load(philip_raw_url)
load(taiwan_raw_url)
load(thai_raw_url)
load(malay_raw_url)
load(singapore_raw_url)
load(sk_raw_url)
load(cambodia_raw_url)
mongolia <- needed(mongolia_raw)
philip <- needed(philip_raw)
taiwan <- needed(taiwan_raw)
no non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Inf
thai <- needed(thai_raw)
malay <- needed(malay_raw)
singapore <- needed(singapore_raw) #Singapore hat extrem viele Missing values
sk <- needed(sk_raw)
cambodia <- needed(cambodia_raw)
asian<- rbind(asian_3,myanmar,cambodia,sk,singapore,malay,thai,taiwan,philip,
cambodia,mongolia) %>% as.tbl()
asian
European Social Survey
load(ESS_raw_url)
ESS <-ESS_raw %>%
rename(demtoday = dmcntov,
age = agea,
year = inwyys,
trust_gov = trstplt,
trust_parliament = trstprl,
trust_police = trstplc,
trust_courts = trstlgl) %>%
mutate(income = 5 - hincfel,
educ = Recode(eisced,
"55 = NA"),
work = ifelse(mnactic == 1, 1, 0),
sex = gndr - 1, #sex variable erstellen
cntry = to_label(cntry)) %>%
select(cntry,year,age,sex, income, educ, work, demtoday, trust_gov, trust_parliament,
trust_police, trust_courts) %>%
# mutate_at(vars(income, demtoday, educ,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.character) %>%
# mutate_at(vars(income, demtoday, educ,
# trust_gov, trust_parliament,
# trust_police, trust_courts),
# as.numeric) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
stdz) %>%
mutate_at(vars(income, demtoday, educ,
trust_gov, trust_parliament,
trust_police, trust_courts),
range01)
ESS
Merging Everything
ESS$survey <- rep("ESS",nrow(ESS))
asian$survey <- rep("asian",nrow(asian))
americas$survey <- rep("americas",nrow(americas))
wvs$survey <- rep("wvs",nrow(wvs))
latino$survey <- rep("latino",nrow(latino))
afro$survey <- rep("afro",nrow(afro))
americas$cntry <- as.character(americas$cntry)
americas$cntry[americas$cntry=="Hait?"] <- "Haiti"
americas$cntry<-countrycode(americas$cntry,"country.name.en","country.name.en")
Some values were not matched unambiguously: Hait攼㹤
wvs$cntry<-countrycode(wvs$cntry,"country.name.en","country.name.en")
latino$cntry<-countrycode(latino$cntry,"country.name.en","country.name.en")
afro$cntry<-countrycode(afro$cntry,"country.name.en","country.name.en")
asian$cntry<-countrycode(asian$cntry,"country.name.en","country.name.en")
ESS$cntry<-countrycode(ESS$cntry,"country.name.en","country.name.en")
unique(ESS$cntry)
[1] "Albania" "Belgium"
[3] "Bulgaria" "Switzerland"
[5] "Cyprus" "Czech Republic"
[7] "Germany" "Denmark"
[9] "Estonia" "Spain"
[11] "Finland" "France"
[13] "United Kingdom of Great Britain and Northern Ireland" "Hungary"
[15] "Ireland" "Israel"
[17] "Iceland" "Italy"
[19] "Lithuania" "Netherlands"
[21] "Norway" "Poland"
[23] "Portugal" "Russian Federation"
[25] "Sweden" "Slovenia"
[27] "Slovakia" "Ukraine"
[29] "Kosovo"
unique(asian$cntry)
[1] "Japan" "Hong Kong" "Republic of Korea" "China"
[5] "Mongolia" "Philippines" "Taiwan, Province of China" "Thailand"
[9] "Indonesia" "Singapore" "Viet Nam" "Cambodia"
[13] "Malaysia" "Myanmar"
unique(wvs$cntry)
[1] "Algeria" "Argentina" "Armenia" "Australia"
[5] "Azerbaijan" "Bahrain" "Belarus" "Brazil"
[9] "Colombia" "Cyprus" "Chile" "China"
[13] "Ecuador" "Egypt" "Estonia" "Georgia"
[17] "Germany" "Ghana" "Hong Kong" "India"
[21] "Iraq" "Japan" "Jordan" "Kazakhstan"
[25] "Kuwait" "Kyrgyzstan" "Lebanon" "Libya"
[29] "Malaysia" "Mexico" "Morocco" "Netherlands"
[33] "New Zealand" "Nigeria" "Pakistan" "Palestine, State of"
[37] "Peru" "Philippines" "Poland" "Qatar"
[41] "Romania" "Russian Federation" "Rwanda" "Singapore"
[45] "Slovenia" "Republic of Korea" "South Africa" "Spain"
[49] "Sweden" "Taiwan, Province of China" "Thailand" "Trinidad and Tobago"
[53] "Tunisia" "Turkey" "Ukraine" "United States of America"
[57] "Uruguay" "Uzbekistan" "Yemen" "Zimbabwe"
unique(latino$cntry)
[1] "Argentina" "Bolivia (Plurinational State of)" "Brazil"
[4] "Colombia" "Costa Rica" "Chile"
[7] "Ecuador" "El Salvador" "Spain"
[10] "Guatemala" "Honduras" "Mexico"
[13] "Nicaragua" "Panama" "Paraguay"
[16] "Peru" "Dominican Republic" "Uruguay"
[19] "Venezuela, Bolivarian Republic of"
unique(americas$cntry)
[1] "Bahamas" "Barbados" "Belize"
[4] "Brazil" "Colombia" "Costa Rica"
[7] "Dominican Republic" "Ecuador" "El Salvador"
[10] "Guatemala" "Guyana" NA
[13] "Honduras" "Jamaica" "Mexico"
[16] "Nicaragua" "Panama" "Paraguay"
[19] "Peru" "Suriname" "Trinidad and Tobago"
[22] "Uruguay" "Bolivia (Plurinational State of)" "Canada"
unique(afro$cntry)
[1] "Algeria" "Burundi" "Benin"
[4] "Burkina Faso" "Botswana" "Cameroon"
[7] "Côte D'Ivoire" "Cabo Verde" "Egypt"
[10] "Ghana" "Guinea" "Kenya"
[13] "Lesotho" "Liberia" "Madagascar"
[16] "Mauritius" "Mali" "Malawi"
[19] "Mozambique" "Morocco" "Namibia"
[22] "Niger" "Nigeria" "South Africa"
[25] "Senegal" "Sierra Leone" "Sudan"
[28] "Swaziland" "United Republic of Tanzania" "Togo"
[31] "Tunisia" "Uganda" "Zambia"
[34] "Zimbabwe" "Gabon" "Sao Tome and Principe"
wvs <- wvs %>% dplyr::select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts,survey)
latino <- latino %>% dplyr::select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts,survey)
afro <- afro %>% dplyr::select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts,survey)
americas <- americas %>% dplyr::select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts,survey)
asian <- asian %>% dplyr::select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts,survey)
ESS <- ESS %>% dplyr::select(cntry,year,age,sex, income,
educ, work, demtoday,
trust_gov, trust_parliament,
trust_police, trust_courts,survey)
merged <- rbind(wvs,latino,afro,americas,asian,ESS)
merged <- merged %>%
#create dummies
mutate(wvs = ifelse(survey=="wvs",1, 0),
afro = ifelse(survey=="afro",1, 0),
latino = ifelse(survey=="latino",1, 0),
americas = ifelse(survey=="americas",1, 0),
asian = ifelse(survey=="asian",1, 0),
ESS = ifelse(survey=="ESS",1, 0)
) %>%
#filter bad countries
filter(cntry!="Egypt") %>% #exclude Egypt 2013
filter(cntry!="Libya") %>% #exclude Libya 2014
filter(cntry!="Mali") %>% #exclude Mali 2012
filter(cntry!="Yemen") %>% #exclude Yemen 2012
filter(cntry!="Palestine, State of") #exclude Palestine 2013
# adding weight
merged <- merged %>%
group_by(cntry) %>%
tally() %>%
mutate(weight = 1000/n) %>%
select(cntry, weight) %>%
left_join(merged, "cntry")
# select(cntry, year) %>%
# unique %>%
# View
merged
table(merged$wvs)
0 1
301009 80618
table(merged$afro)
0 1
280893 100734
table(merged$latino)
0 1
338714 42913
table(merged$americas)
0 1
311125 70502
table(merged$asian)
0 1
349440 32187
table(merged$ESS)
0 1
326954 54673
SEM Index
merged2 <- merged %>%
mutate(gov_trust = trust_gov + trust_parliament +
trust_police + trust_courts) %>%
filter(!is.na(gov_trust))
merged3 <- merged %>%
mutate(gov_trust = trust_gov + trust_parliament +
trust_police + trust_courts) %>%
filter(is.na(gov_trust))
svy.df <- survey::svydesign(id= ~1,
weights= ~weight,
data= merged)
model <- '# measurement model 1
gov_trust2 =~ 1*trust_gov + trust_parliament +
trust_police + trust_courts
trust_gov ~~ trust_parliament
'
merged <- merged %>%
mutate_at(vars(trust_gov, trust_parliament,
trust_police, trust_courts), as.numeric)
# cor(na.omit(data.frame(merged$trust_gov,
# merged$trust_police,
# merged$trust_courts,
# merged$trust_parliament,
# merged$demtoday)))
lavaan_model1<-cfa(model, meanstructure = T,
data = as.data.frame(merged),
estimator= "MLM")
fit_a1<-lavaan.survey(lavaan_model1,
estimator= "MLM", survey.design=svy.df)
summary(fit_a1, standardized=TRUE,fit.measures = TRUE, rsq = T)
lavaan (0.5-23.1097) converged normally after 38 iterations
Number of observations 339509
Estimator ML Robust
Minimum Function Test Statistic 4.858 2.577
Degrees of freedom 1 1
P-value (Chi-square) 0.028 0.108
Scaling correction factor 1.885
for the Satorra-Bentler correction
Model test baseline model:
Minimum Function Test Statistic 503887.369 334369.533
Degrees of freedom 6 6
P-value 0.000 0.000
User model versus baseline model:
Comparative Fit Index (CFI) 1.000 1.000
Tucker-Lewis Index (TLI) 1.000 1.000
Robust Comparative Fit Index (CFI) 1.000
Robust Tucker-Lewis Index (TLI) 1.000
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -159340.600 -159340.600
Loglikelihood unrestricted model (H1) -159338.171 -159338.171
Number of free parameters 13 13
Akaike (AIC) 318707.201 318707.201
Bayesian (BIC) 318846.759 318846.759
Sample-size adjusted Bayesian (BIC) 318805.445 318805.445
Root Mean Square Error of Approximation:
RMSEA 0.003 0.002
90 Percent Confidence Interval 0.001 0.007 0.000 0.005
P-value RMSEA <= 0.05 1.000 1.000
Robust RMSEA 0.003
90 Percent Confidence Interval 0.000 0.008
Standardized Root Mean Square Residual:
SRMR 0.000 0.000
Parameter Estimates:
Information Expected
Standard Errors Robust.sem
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
gov_trust2 =~
trust_gov 1.000 0.208 0.613
trust_parlimnt 1.015 0.003 330.156 0.000 0.211 0.653
trust_police 1.099 0.004 253.511 0.000 0.228 0.700
trust_courts 1.315 0.005 247.330 0.000 0.273 0.847
Covariances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.trust_gov ~~
.trust_parlimnt 0.029 0.000 123.012 0.000 0.029 0.438
Intercepts:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.trust_gov 0.484 0.001 715.884 0.000 0.484 1.428
.trust_parlimnt 0.456 0.001 703.812 0.000 0.456 1.414
.trust_police 0.536 0.001 822.959 0.000 0.536 1.644
.trust_courts 0.515 0.001 796.359 0.000 0.515 1.595
gov_trust2 0.000 0.000 0.000
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.trust_gov 0.072 0.000 259.086 0.000 0.072 0.624
.trust_parlimnt 0.060 0.000 226.846 0.000 0.060 0.573
.trust_police 0.054 0.000 218.146 0.000 0.054 0.510
.trust_courts 0.029 0.000 107.510 0.000 0.029 0.282
gov_trust2 0.043 0.000 148.215 0.000 1.000 1.000
R-Square:
Estimate
trust_gov 0.376
trust_parlimnt 0.427
trust_police 0.490
trust_courts 0.718
merged4<-cbind(merged2, predict(fit_a1, newdata = merged2))
merged4$gov_trust2<-range01(merged4$gov_trust2)
# head(merged4)
merged<-plyr::rbind.fill(merged3,merged4)
merged$gov_trust<-merged$gov_trust2
head(merged)
Some Recoding
table(merged$cntry,merged$year)
1582 1583 2000 2010 2011 2012 2013 2014 2015 2077
Albania 0 0 0 0 0 615 586 0 0 0
Algeria 0 0 0 0 0 0 2404 0 1200 0
Argentina 0 0 0 0 0 0 2230 0 1200 0
Armenia 0 0 0 0 1100 0 0 0 0 0
Australia 0 0 0 0 0 1477 0 0 0 0
Azerbaijan 0 0 0 0 1002 0 0 0 0 0
Bahamas 0 0 0 0 0 0 0 3429 0 0
Bahrain 0 0 0 0 0 0 0 1200 0 0
Barbados 0 0 0 0 0 0 0 3828 0 0
Belarus 0 0 0 0 1535 0 0 0 0 0
Belgium 0 0 0 0 0 1869 0 0 0 0
Belize 0 0 0 0 0 1512 0 1533 0 0
Benin 0 0 0 0 1200 0 0 1200 0 0
Bolivia (Plurinational State of) 0 0 0 0 0 3029 1200 0 1200 0
Botswana 0 0 0 0 0 1200 0 1200 0 0
Brazil 0 0 0 0 0 1499 1204 2986 1250 0
Bulgaria 0 0 0 0 0 0 2260 0 0 0
Burkina Faso 0 0 0 0 0 1200 0 0 1200 0
Burundi 0 0 0 0 0 1200 0 1200 0 0
Cabo Verde 0 0 0 0 1208 0 0 1200 0 0
Cambodia 0 0 0 0 0 1200 0 0 2400 0
Cameroon 0 0 0 0 0 0 1200 0 1182 0
Canada 0 0 0 1500 0 0 0 0 0 0
Chile 0 0 0 0 1000 0 1200 0 1200 0
China 0 3 1 0 3408 2360 0 0 0 1
Colombia 0 0 0 0 0 3024 1200 1496 1200 0
Costa Rica 0 0 0 0 0 1498 1000 1537 1000 0
Côte D'Ivoire 0 0 0 0 0 0 1200 1199 0 0
Cyprus 0 0 0 0 1000 1089 27 0 0 0
Czech Republic 0 0 0 0 0 0 2009 0 0 0
Denmark 0 0 0 0 0 0 1650 0 0 0
Dominican Republic 0 0 0 0 0 1512 1000 1520 1000 0
Ecuador 0 0 0 0 0 1500 2402 0 1200 0
El Salvador 0 0 0 0 0 1497 1000 1512 1000 0
Estonia 0 0 0 0 1533 2279 101 0 0 0
Finland 0 0 0 0 0 1884 313 0 0 0
France 0 0 0 0 0 0 1968 0 0 0
Gabon 0 0 0 0 0 0 0 0 1198 0
Georgia 0 0 0 0 0 0 0 1202 0 0
Germany 0 0 0 0 0 2753 2251 0 0 0
Ghana 0 0 0 0 0 3952 0 2400 0 0
Guatemala 0 0 0 0 0 1509 1000 1506 1000 0
Guinea 0 0 0 0 0 0 1200 0 1200 0
Guyana 0 0 0 0 0 1529 0 1557 0 0
Honduras 0 0 0 0 0 1728 1000 1561 1000 0
Hong Kong 0 0 0 0 0 1207 1000 0 0 0
Hungary 0 0 0 0 0 1895 119 0 0 0
Iceland 0 0 0 0 0 601 151 0 0 0
India 0 0 0 0 0 0 0 1581 0 0
Indonesia 0 0 0 0 1550 0 0 0 0 0
Iraq 0 0 0 0 0 1200 0 0 0 0
Ireland 0 0 0 0 0 995 1633 0 0 0
Israel 0 0 0 0 0 2229 279 0 0 0
Italy 0 0 0 0 0 0 960 0 0 0
Jamaica 0 0 0 0 0 1500 0 1503 0 0
Japan 0 0 0 2443 1880 0 0 0 0 0
Jordan 0 0 0 0 0 0 0 1200 0 0
Kazakhstan 0 0 0 0 1500 0 0 0 0 0
Kenya 0 0 0 0 2399 0 0 2397 0 0
Kosovo 0 0 0 0 0 0 1295 0 0 0
Kuwait 0 0 0 0 0 0 0 1303 0 0
Kyrgyzstan 0 0 0 0 1500 0 0 0 0 0
Lebanon 0 0 0 0 0 0 1200 0 0 0
Lesotho 0 0 0 0 0 1197 0 1200 0 0
Liberia 0 0 0 0 0 1199 0 0 1199 0
Lithuania 0 0 0 0 0 0 2109 0 0 0
Madagascar 0 0 0 0 0 0 1200 1015 185 0
Malawi 0 0 0 0 0 2407 0 2400 0 0
Malaysia 0 0 0 0 1214 1300 0 1207 0 0
Mauritius 0 0 0 0 0 1200 0 1200 0 0
Mexico 0 0 0 0 0 3560 1200 1535 1200 0
Mongolia 0 0 0 1210 0 0 0 1228 0 0
Morocco 0 0 0 0 1200 0 1196 0 1200 0
Mozambique 0 0 0 0 0 2400 0 0 2400 0
Myanmar 0 0 0 0 0 0 0 0 1620 0
Namibia 0 0 0 0 0 1200 0 1200 0 0
Netherlands 0 0 0 0 0 3381 366 0 0 0
New Zealand 0 0 0 0 841 0 0 0 0 0
Nicaragua 0 0 0 0 0 1686 1000 1546 1000 0
Niger 0 0 0 0 0 0 1199 0 1200 0
Nigeria 0 0 0 0 1759 2364 36 2319 81 0
Norway 0 0 0 0 0 1446 178 0 0 0
Pakistan 0 0 0 0 0 1200 0 0 0 0
Panama 0 0 0 0 0 1620 1000 1508 1000 0
Paraguay 0 0 0 0 0 1510 1200 1503 1200 0
Peru 0 0 0 0 0 2710 1200 1500 1200 0
Philippines 0 0 0 1200 0 1200 0 1200 0 0
Poland 0 0 0 0 0 2851 13 0 0 0
Portugal 0 0 0 0 0 395 1756 0 0 0
Qatar 0 0 0 1060 0 0 0 0 0 0
Republic of Korea 0 0 0 1200 1207 0 0 0 1200 0
Romania 0 0 0 0 0 1503 0 0 0 0
Russian Federation 0 0 0 0 2500 2484 0 0 0 0
Rwanda 0 0 0 0 0 1527 0 0 0 0
Sao Tome and Principe 0 0 0 0 0 0 0 0 1196 0
Senegal 0 0 0 0 0 0 1200 1200 0 0
Sierra Leone 0 0 0 0 0 1190 0 0 1191 0
Singapore 1000 0 0 0 0 1972 0 993 46 0
Slovakia 0 0 0 0 0 1415 432 0 0 0
Slovenia 0 0 0 0 1069 1257 0 0 0 0
[ reached getOption("max.print") -- omitted 24 rows ]
table(subset(merged,merged$cntry=="China")$survey,
subset(merged,merged$cntry=="China")$year)
1583 2000 2011 2012 2077
asian 3 1 3408 60 1
wvs 0 0 0 2300 0
merged$year[merged$cntry=="China" & merged$year == 1583] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2000] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2077] <- 2011
merged$year[merged$cntry=="China" & merged$year == 2012] <- 2011
table(subset(merged,merged$cntry=="Singapore")$survey,
subset(merged,merged$cntry=="Singapore")$year)
1582 2012 2014 2015
asian 1000 0 993 46
wvs 0 1972 0 0
merged$year[merged$cntry=="Singapore" & merged$year == 1582] <- 2011
hist(merged$gov_trust)

Level 2 Data
V-Dem
To Do - Regions
mutate(regions = vdems_sub %>%
dcast(country_name ~ year,
value.var=c("e_regionpol")) %>%
select('2000') %>%
mutate(regions = fct_recode(as.factor(`2000`),
"E. Europe and C. Asia (post-Communist)" = "1",
"Latin America & Carribean" = "2",
"MENA" = "3",
"Sub-Saharan Africa" = "4",
"W. Europe and N. America" = "5",
"South & East Asia & Pacific" = "6",
"South & East Asia & Pacific" = "7",
"South & East Asia & Pacific" = "8",
"South & East Asia & Pacific" = "9",
"Latin America & Carribean" = "10") %>%
as_factor)) %>%
select(regions)
Error in as_data_frame(data) :
argument ".data" is missing, with no default
QoG
load(qog_url)
qog10 <- qog %>%
filter(year %in% 2000:2010) %>%
mutate(cntry = countrycode(ccodecow, "cown","country.name.en"))
qog10 <- qog %>%
filter(year %in% 2000:2010) %>%
mutate(cntry = countrycode(ccodecow, "cown","country.name.en")) %>%
group_by(cntry) %>%
tally() %>%
mutate(ethnic10 = qog10 %>%
dcast(cntry ~ year,
value.var=c("al_ethnic"),
fun.aggregate = mean) %>%
select(`2000`:`2010`) %>%
rowMeans) %>%
select(-n)
# mutate(al_ethnic = as.numeric(al_ethnic)) %>%
qog10
Merging Time
Level 2
level2 <- merge(x=qog10, y=vdem, by="cntry")
level2
Ind + Country
combined <- merge(x=merged, y=level2, by="cntry") %>%
mutate(cntryears = paste(cntry, year))
#combined$cntryears <- paste(combined$cntry,combined$year)
vdem2 <- vdems_start %>%
filter(year %in% 2010:2015) %>%
mutate(cntry = countrycode(country_name,"country.name.en","country.name.en")) #%>%
Some values were not matched unambiguously: Democratic Republic of Vietnam
# select(cntry, country_name)
vdem2$cntry[996] <- "Viet Nam"
vdem2$cntry[997] <- "Viet Nam"
vdem2$cntry[998] <- "Viet Nam"
vdem2$cntry[999] <- "Viet Nam"
vdem2$cntry[1000] <- "Viet Nam"
vdem2$cntry[1001] <- "Viet Nam"
combined <- vdem2 %>%
mutate(cntryears = paste(cntry, year)) %>%
mutate(discuss_unsel = v2xcl_disc) %>%
select(cntryears, discuss_unsel) %>%
merge(combined, by = "cntryears") %>%
plyr::ddply(~cntry,
summarise,
discuss = mean(discuss_unsel, na.rm=T)) %>%
merge(combined, by = "cntry")
combined
save(combined,file="combined.Rdata")
save(level2,file="level2.Rdata")
Weighting
Macro Level
macro <- combined %>%
mutate(gov_trust = range01(gov_trust)*100) %>%
mutate(demtoday = range01(demtoday)*100) %>%
plyr::ddply(~cntry,
summarise,
mean_gov = mean(gov_trust, na.rm=T),
mean_dem = mean(demtoday, na.rm=T),
discuss = mean(discuss, na.rm=T)) %>%
# polity10 = mean(polity10, na.rm=T),
# polity_demdummy = mean(polity_demdummy, na.rm=T)) %>%
mutate(discuss_round = round(discuss*4)) %>%
mutate(mean_gov_low = case_when(
discuss_round == 2 ~ mean_gov * .9,
discuss_round == 1 ~ mean_gov * .85,
discuss_round %in% c(3,4) ~ mean_gov)) %>%
mutate(mean_gov_high = case_when(
discuss_round == 2 ~ mean_gov * .8,
discuss_round == 1 ~ mean_gov * .75,
discuss_round %in% c(3,4) ~ mean_gov)) %>%
merge(level2, by = "cntry") %>%
mutate_at(vars(common10, reason10, consult10,
countr10, engage10, engage10, delib10),
range01)
macro_dem <- macro %>%
filter(polity_demdummy == 1)
macro_aut <- macro %>%
filter(polity_demdummy == 0)
# table_stuff2<-subset(table_stuff,
# !is.na(table_stuff$regime) &
# table_stuff$cntry!="Qatar" &
# table_stuff$cntry!="Uzbekistan")
save(macro, file="macro.Rdata")
save(macro_dem, file="macro_dem.Rdata")
save(macro_aut, file="macro_aut.Rdata")
Crap
compare_cntry<-data.frame(table(merged$cntry,merged$year))
compare_cntry<-tidyr::spread(compare_cntry,Var2,Freq)
compare_cntry[compare_cntry==0]<-100000
#compare_cntry<-na.omit(compare_cntry)
indie<-as.numeric(apply(compare_cntry[,-1],1,sum))
compare_cntry$double<-indie<900000
compare_cntry[compare_cntry==100000]<-0
compare_cntry2 <- subset(compare_cntry,compare_cntry$double==TRUE)
compare_cntry3 <- subset(merged,merged$cntry %in% compare_cntry2$Var1)
y1<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
compare_cntry3$year==2012)$gov_trust
y2<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
compare_cntry3$year==2014)$gov_trust
t.test(y1,y2)
y1<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
compare_cntry3$year==2012)$gov_trust
y2<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
compare_cntry3$year==2013)$gov_trust
t.test(y1,y2)
y1<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
compare_cntry3$year==2011)$gov_trust
y2<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
compare_cntry3$year==2013)$gov_trust
t.test(y1,y2)
subset(merged,merged$year==2012)
library(dplyr)
compare_cntry4 <- compare_cntry3 %>%
group_by(cntry,year) %>%
summarise_all(funs(mean(., na.rm=TRUE)))
compare_cntry4$cntryear<-paste(compare_cntry4$cntry,compare_cntry4$year)
as.data.frame(compare_cntry4[,c(17,8)])
?ddply
head(afro)
afrocntry<-unique(afro$cntry)
latinocntry<-unique(latino2013$cntry)
arabcntry<-unique(arab3$cntry)
wvscntry<-unique(wvs$cntry)
cntry_table<- data.frame(as.character(wvscntry),
c(as.character(arabcntry),rep("-",48)),
c(as.character(latinocntry),rep("-",41)),
c(as.character(afrocntry),rep("-",24)))
colnames(cntry_table) <- c("wvs","arab","latino","afro")
arrange(cntry_table, wvs, afro)
table(combined$politcat.x)
mplusdata <- combined %>% dplyr::select(cntry, delib10, demtoday,
trust_gov, trust_parliament,
trust_police,trust_courts,weight)
mplusdata <- na.omit(mplusdata)
mplusdata$cntry <- as.numeric(mplusdata$cntry)
write_csv(mplusdata, path = "mplusdata.csv", col_names = F)
mplusdata2 <- combined %>% dplyr::select(cntry, delib10, demtoday,
gov_trust,weight)
mplusdata2 <- na.omit(mplusdata2)
mplusdata2$cntry <- as.numeric(mplusdata2$cntry)
write_csv(mplusdata2, path = "mplusdat2a.csv", col_names = F)
mplusdata2_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday,
gov_trust,weight)
mplusdata2_dem <- na.omit(mplusdata2_dem)
mplusdata2_dem$cntry <- as.numeric(mplusdata2_dem$cntry)
write_csv(mplusdata2_dem, path = "mplusdat2_dema.csv", col_names = F)
mplusdata2_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday,
gov_trust,weight)
mplusdata2_aut <- na.omit(mplusdata2_aut)
mplusdata2_aut$cntry <- as.numeric(mplusdata2_aut$cntry)
write_csv(mplusdata2_aut, path = "mplusdat2_auta.csv", col_names = F)
combined <- merge(combined, physi2_s, by = "cntry")
combined_dem <- subset(combined,combined$polity_demdummy==1)
mplusdata_dem <- combined_dem %>% dplyr::select(cntry, delib10, demtoday,
trust_gov, trust_parliament,
trust_police,trust_courts,weight)
mplusdata_dem <- na.omit(mplusdata_dem)
mplusdata_dem$cntry <- as.numeric(mplusdata_dem$cntry)
write_csv(mplusdata_dem, path = "mplusdata_dem.csv", col_names = F)
combined_aut <- subset(combined,combined$polity_demdummy==0)
mplusdata_aut <- combined_aut %>% dplyr::select(cntry, delib10, demtoday,
trust_gov, trust_parliament,
trust_police,trust_courts,weight)
mplusdata_aut <- na.omit(mplusdata_aut)
mplusdata_aut$cntry <- as.numeric(mplusdata_aut$cntry)
write_csv(mplusdata_aut, path = "mplusdata_aut.csv", col_names = F)
#data_wids <- dcast(merged, cntry~year,
# value.var=c("year"))
#data_wids2 <- as.data.frame(lapply(data_wids[,-1],function(n) 0<n))
#data_wids3 <- as.data.frame(apply(data_wids2,2,as.numeric))
#data_wids3 <- cbind(data_wids[,1],data_wids3)
#names(data_wids3)[1]<-"cntry"
#table_stuff <- merge(data_wids3 ,table_stuff, by="cntry")
#table_stuff$polity10[table_stuff$cntry=="Tunisia"] <- 5.32382
#table_stuff2$polity10[table_stuff2$cntry=="Tunisia"] <- 5.32382
head(table_stuff)
cor(na.omit(data.frame(table_stuff$legit,table_stuff$legit2,table_stuff$legit3,
table_stuff$mean_gov)))
table_stuff$gni <- table_stuff$gni_c
table_stuff$gni_c[table_stuff$gni <= 1025] <- "low"
table_stuff$gni_c[table_stuff$gni > 1026 & table_stuff$gni <= 4035] <- "lower-middle"
table_stuff$gni_c[table_stuff$gni > 4036 & table_stuff$gni <= 12475] <- "upper-middle"
table_stuff$gni_c[table_stuff$gni > 12475] <- "high"
table_stuff$gni_c2 <- table_stuff$gni_c
table_stuff$gni_c2[table_stuff$gni_c == "lower-middle"] <- "low"
table_stuff$gni_c2[table_stuff$gni_c == "upper-middle"] <- "high"
table(table_stuff$gni_c)
table(table_stuff$gni_c2)
The cut-off points are HDI of less than 0.550
for low human development, 0.550-0.699 for medium human
development, 0.700-0.799 for high human development and
0.800 or greater for very high human development.
#table_stuff$hdi_c <- table_stuff$hdi
#table_stuff$hdi_c[table_stuff$hdi < 0.550] <- "low"
#table_stuff$hdi_c[table_stuff$hdi >= 0.550 & table_stuff$hdi <= 0.699] <- "medium"
#table_stuff$hdi_c[table_stuff$hdi >= 0.700 & table_stuff$hdi <= 0.899] <- "high"
#table_stuff$hdi_c[table_stuff$hdi >= 0.90] <- "very high"
#table(table_stuff$hdi_c)
table(round(table_stuff$terror))
table_stuff$mean_gov2 <- table_stuff$mean_gov
table_stuff$mean_gov2[is.na(table_stuff$mean_gov2)]<-999
table_stuff$mean_gov3 <- table_stuff$mean_gov
table_stuff$mean_gov3[is.na(table_stuff$mean_gov3)]<-999
table_stuff$mean_gov4 <- table_stuff$mean_gov
table_stuff$mean_gov4[is.na(table_stuff$mean_gov4)]<-999
table_stuff$mean_gov5 <- table_stuff$mean_gov
table_stuff$mean_gov5[is.na(table_stuff$mean_gov5)]<-999
table_stuff$mean_gov6 <- table_stuff$mean_gov
table_stuff$mean_gov6[is.na(table_stuff$mean_gov6)]<-999
table_stuff$mean_gov7 <- table_stuff$mean_gov
table_stuff$mean_gov7[is.na(table_stuff$mean_gov7)]<-999
table_stuff$mean_gov8 <- table_stuff$mean_gov
table_stuff$mean_gov8[is.na(table_stuff$mean_gov8)]<-999
table_stuff$mean_gov9 <- table_stuff$mean_gov
table_stuff$mean_gov9[is.na(table_stuff$mean_gov9)]<-999
table_stuff$physviol2 <- table_stuff$physviol
table_stuff$physviol2[is.na(table_stuff$physviol2)] <- 999
table_stuff$terror2 <- round(table_stuff$terror)
table_stuff$terror2[is.nan(table_stuff$terror2)] <- 999
table_stuff$discuss2 <- round(table_stuff$discuss*4)
table_stuff$discuss2[is.nan(table_stuff$discuss2)] <- 999
table(table_stuff$physviol)
table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-5
table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-10
table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-15
table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1]-20
table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] -25
table_stuff$mean_gov2[table_stuff$mean_gov2>100] <- NA
table(table_stuff$mean_gov2)
table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-8
table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-16
table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-24
table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] -32
table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] -30
table_stuff$mean_gov3[table_stuff$mean_gov3>100] <- NA
table(table_stuff$mean_gov3)
table_stuff$mean_gov4[table_stuff$terror2==5] <- table_stuff$mean_gov4[table_stuff$terror2==5]-5
table_stuff$mean_gov4[table_stuff$terror2==4] <- table_stuff$mean_gov4[table_stuff$terror2==4]-10
table_stuff$mean_gov4[table_stuff$terror2==3] <- table_stuff$mean_gov4[table_stuff$terror2==3]-15
table_stuff$mean_gov4[table_stuff$mean_gov4>100] <- NA
table(table_stuff$mean_gov4)
table_stuff$mean_gov5[table_stuff$terror2==5] <- table_stuff$mean_gov5[table_stuff$terror2==5]-8
table_stuff$mean_gov5[table_stuff$terror2==4] <- table_stuff$mean_gov5[table_stuff$terror2==4]-16
table_stuff$mean_gov5[table_stuff$terror2==3] <- table_stuff$mean_gov5[table_stuff$terror2==3]-24
table_stuff$mean_gov5[table_stuff$mean_gov5>100] <- NA
table(table_stuff$mean_gov5)
table_stuff$mean_gov6[table_stuff$discuss2==2] <- table_stuff$mean_gov6[table_stuff$discuss2==2] -5
table_stuff$mean_gov6[table_stuff$discuss2==1] <- table_stuff$mean_gov6[table_stuff$discuss2==1] -10
table_stuff$mean_gov6[table_stuff$mean_gov6>100] <- NA
table(table_stuff$mean_gov6)
table_stuff$mean_gov7[table_stuff$discuss2==2] <- table_stuff$mean_gov7[table_stuff$discuss2==2] -10
table_stuff$mean_gov7[table_stuff$discuss2==1] <- table_stuff$mean_gov7[table_stuff$discuss2==1] -20
table_stuff$mean_gov7[table_stuff$mean_gov7>100] <- NA
table(table_stuff$mean_gov7)
load(qog_url)
qog10 <- subset(qog,qog$year==2000 |
qog$year==2001 |
qog$year==2002 |
qog$year==2003 |
qog$year==2004 |
qog$year==2005 |
qog$year==2006 |
qog$year==2007 |
qog$year==2008 |
qog$year==2009 |
qog$year==2010)
library(countrycode)
qog10$cntry<-countrycode(qog10$ccodecow, "cown","country.name.en")
qog10$al_ethnic<-as.numeric(qog10$al_ethnic)
#tidyr::gather(qog10,c("cntry","year"),"al_ethnic")
qog10a <- qog10 %>% dplyr::select(cntry,year,al_ethnic) %>%
as.data.frame()
data_wide17 <- reshape(data = qog10a,
idvar = "cntry",
v.names = "al_ethnic",
timevar = "year",
direction = "wide")
#qog10hdi <- qog10 %>% dplyr::select(cntry,year,undp_hdi) %>%
# as.data.frame()
#data_wide_hdi <- hdi
#reshape(data = qog10hdi,
# idvar = "cntry",
# v.names = "undp_hdi",
# timevar = "year",
# direction = "wide")
table(qog$al_ethnic,qog$year)
qog14 <- subset(qog,qog$year==2014)
qog14$cntry<-countrycode(qog14$ccodecow, "cown","country.name.en")
qog14 <- qog14 %>% dplyr::select(cntry,year,cspf_legit) %>%
as.data.frame()
data_wide18 <- reshape(data = qog14,
idvar = "cntry",
v.names = "cspf_legit",
timevar = "year",
direction = "wide")
qog15 <- subset(qog,qog$year==2015)
qog15$cntry<-countrycode(qog15$ccodecow, "cown","country.name.en")
qog15 <- qog15 %>% dplyr::select(cntry,year,ffp_sl) %>%
as.data.frame()
data_wide19 <- reshape(data = qog15,
idvar = "cntry",
v.names = "ffp_sl",
timevar = "year",
direction = "wide")
qog10$ciri_physint<-as.numeric(qog10$ciri_physint)
qog10a <- qog10 %>% dplyr::select(cntry,year,ciri_physint) %>%
as.data.frame()
data_wide20 <- reshape(data = qog10a,
idvar = "cntry",
v.names = "ciri_physint",
timevar = "year",
direction = "wide")
qog10$gd_ptss <-as.numeric(qog10$gd_ptss)
qog10a <- qog10 %>% dplyr::select(cntry,year,gd_ptss) %>%
as.data.frame()
data_wide21 <- reshape(data = qog10a,
idvar = "cntry",
v.names = "gd_ptss",
timevar = "year",
direction = "wide")
qog14<-subset(qog,qog$year==2014)
qog13<-subset(qog,qog$year==2013)
qog12<-subset(qog,qog$year==2012)
qog11<-subset(qog,qog$year==2011)
qog10<-subset(qog,qog$year==2010)
qog8<-subset(qog,qog$year==2008)
qog7<-subset(qog,qog$year==2007)
qog6<-subset(qog,qog$year==2006)
qog5<-subset(qog,qog$year==2005)
qog4<-subset(qog,qog$year==2004)
qog3<-subset(qog,qog$year==2003)
qog2<-subset(qog,qog$year==2002)
qog1<-subset(qog,qog$year==2001)
qog0<-subset(qog,qog$year==2000)
table(is.na(qog$wel_culture),qog$year)
culreg<- pmax(qog14$wel_culture, qog13$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog12$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog11$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog8$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog7$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog6$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog5$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog4$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog3$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog2$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog1$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog0$wel_culture, na.rm = TRUE)
culreg<- as.character(sjmisc::to_label(culreg))
culreg<-as.data.frame(cbind(culreg,qog14$ccodecow))
oreast <- subset(culreg, culreg$culreg == "Orthodox East")
oreast
#culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
qog14$ht_region
culreg$cntry<-countrycode(culreg$V2, "cown","country.name.en")
tabeletto<-merge(table_stuff,culreg,by="cntry")
tabeletto<-as.data.frame(cbind(table_stuff$regions,
as.character(table_stuff$cntry),
as.character(tabeletto$culreg)))
tabeletto <- tabeletto[order(tabeletto$V1, tabeletto$V3),]
#edit(tabeletto)
culreg<-data.frame(cbind(tabeletto,culreg))
culreg<-culreg[,c(2,4)]
names(culreg)[1]<-c("cntry")
table_stuff3 <- merge(table_stuff,culreg,by="cntry")
table(as.character(tabeletto$V3))
qog100 <- subset(qog,qog$year==2010)
qog100$cntry<-countrycode(sjmisc::to_label(qog100$ccodecow), "cown","country.name.en")
qog100 <- qog100 %>% dplyr::select(cntry,year,ht_regtype1) %>%
as.data.frame()
qog100$regtype<-sjmisc::to_label(qog100$ht_regtype1)
qog100$year <- NULL
qog100$ht_regtype1 <- NULL
table(qog100$regtype)
ethnic10<-as.numeric(rowMeans(data_wide17[,2:12])) # mean over last 10 years (2000 - 2010)
physint10<-as.numeric(rowMeans(data_wide20[,2:12])) # mean over last 10 years (2000 - 2010)
terror10<-as.numeric(rowMeans(data_wide21[,2:12])) # mean over last 10 years (2000 - 2010)
legit<-as.numeric(data_wide18[,2]) # mean over last 10 years (2000 - 2010)
legit2<-as.numeric(data_wide19[,2]) # mean over last 10 years (2000 - 2010)
qogthingy<-data.frame(data_wide19[,1],ethnic10,legit,legit2,physint10,terror10)
colnames(qogthingy)[1]<-c("cntry")
qogthingy<-merge(x=qogthingy, y=qog100, by="cntry")
#qogthingy<-data.frame(data_wide17[,1],ethnic10)
#colnames(qogthingy)[1]<-c("cntry")
#combined <- merge(x=qogthingy, y=combined, by="cntry")
qog_cs <-read_spss("C:/Users/Favone/Downloads/qog_std_cs_jan17.sav") #loading dataset
qog_cs$cntry<-countrycode(qog_cs$ccodecow, "cown","country.name.en")
qog_cs$legit3<-as.numeric(qog_cs$gov_ixlegitimacyindex)
legit_dat<-data.frame(qog_cs$cntry,qog_cs$legit3)
colnames(legit_dat)<-c("cntry","legit3")
aggrdelib <- merge(x=legit_dat, y=aggrdelib, by="cntry")
aggrdelib$legit3 <- range01(aggrdelib$legit3)
cor(na.omit(aggrdelib[,c(4,5,7,13)]))
cor(na.omit(aggrdelib[,c(4,5,2,6:13)]))
aggrdelib$legit <- 1-range01(aggrdelib$legit)
aggrdelib$legit2 <- 1-range01(aggrdelib$legit2)
aggrdelib$asia <- aggrdelib$e.asia + aggrdelib$s.e.asia + aggrdelib$s.asia + aggrdelib$pacific
SFI <-read_spss("C:/Users/Favone/Downloads/SFIv2016.sav") #loading dataset
SFI <- subset(SFI,SFI$year==2015)
SFI$cntry <-countrycode(SFI$country, "country.name.en","country.name.en")
SFI$cntry[79] <- "North Korea"
SFI$cntry <-countrycode(SFI$cntry, "country.name.en","country.name.en")
SFI$legitimacy <- SFI$legit
SFI$legit <- NULL
aggrdelib <- merge(x=SFI, y=aggrdelib, by="cntry")
hdi <- read_csv("hdi.csv")
hdi$cntry<-countrycode(hdi$Country, "country.name.en","country.name.en")
hdi$'1990'<- NULL ; hdi$'1991'<- NULL ; hdi$'1992'<- NULL ; hdi$'1993'<- NULL
hdi$'1994'<- NULL; hdi$'1995'<- NULL; hdi$'1996'<- NULL; hdi$'1997'<- NULL
hdi$'1998'<- NULL ; hdi$'1999'<- NULL ; hdi$'2011'<- NULL ; hdi$'2012'<- NULL
hdi$'2013'<- NULL; hdi$'2014'<- NULL; hdi$'2015'<- NULL;hdi$`HDI Rank (2015)`<- NULL
hdi$Country<- NULL
hdi10<-as.numeric(rowMeans(hdi[,1:11]))
hdat<-data.frame(hdi$cntry,hdi10)
names(hdat)<-c("cntry","hdi10")
aggrdelib <- merge(x=hdat, y=aggrdelib, by="cntry")
#table(aggrdelib$hdi10)
#gc()
#combined <- merge(x=hdat, y=combined, by="cntry")
#colnames(aggrdelib)[9]<-"e_p_polity"
#lop<-subset(vdems_start,vdems_start$year==2010)
cor(na.omit(aggrdelib2[,2:17]))
cor(na.omit(data.frame(aggrdelib$polity10,aggrdelib$delib10)))
#hist(vdems$v2dlconslt)
#hist(vdems$v2xcl_disc)
#table(vdems_start$e_boix_regime,vdems_start$year)
#table(vdems_sub$e_p_polity,vdems_sub$year)
##### merging time ####
combined <- merge(x=merged, y=aggrdelib, by="cntry")
table(combined$cntry)
combined <- as.data.frame(combined)
combined$gov_trust <- as.numeric(combined$gov_trust)
combined$age <- as.numeric(combined$age)
combined$income <- as.numeric(combined$income)
combined$educ <- as.numeric(combined$educ)
combined$sex <- as.factor(combined$sex)
combined$authoritarian <- as.numeric(combined$authoritarian)
combined$safety <- as.numeric(combined$safety)
combined$demtoday <- as.numeric(combined$demtoday)
combined$latino <- factor(combined$latino)
combined$afro <- factor(combined$afro)
combined$americas <- factor(combined$americas)
combined$asia <- combined$e.asia + combined$s.e.asia + combined$s.asia + combined$pacific
cor(na.omit(data.frame(combined$gov_trust,combined$income,combined$educ, #Socioeconomic factors
combined$delib10, combined$polity10, combined$gdp10, combined$demtoday)))
combined$cntry<-as.factor(combined$cntry)
#combined$polity10 <- combined$polity10*20-10
#combined$regime <- combined$polity10
#combined$regime[combined$polity_autodummy==1] <- "auto"
#combined$regime[combined$polity_anodummy==1] <- "ano"
#combined$regime[combined$polity_demdummy==1] <- "demo"
hist(combined$gov_trust)
qplot(combined$gov_trust)
combined$cntry
#physi_s <- vdems_sub2 %>% dplyr::select(cntryears, franz)
#combined <- merge(combined, physi_s, by = "cntryears")
#physi2_s <- ddply(combined,~cntry,
# summarise,politcat=mean(franz,na.rm=T))
#combined <- merge(combined, physi2_s, by = "cntry")
vdems_sub2$cntryears <- paste(vdems_sub2$cntry,vdems_sub2$year)
physi <- vdems_sub2 %>% dplyr::select(cntryears, perc)
combined <- merge(combined, physi, by = "cntryears")
physi2 <- ddply(combined,~cntry,
summarise,physviol=mean(perc,na.rm=T))
combined <- merge(combined, physi2, by = "cntry")
#physi_22$dis3 <-round(physi_22$dis2)
#unique(physi2_s$cntry)
#1-2.5
#3-5
#5.5 - 7
#physi2_s$politcat2<-8-((physi2_s$politcat) * (7/10))
#11
#physi2_s$polity_demdummy <- physi2_s$politcat2
#physi2_s$polity_demdummy [physi2_s$politcat2 <= 2.5] <- 1
#physi2_s$polity_demdummy [physi2_s$politcat2 > 2.5] <- 0
#table(physi2_s$polity_demdummy)
#physi2_s$polity_anodummy <- physi2_s$politcat2
#physi2_s$polity_anodummy[physi2_s$politcat2 > 2.5 & physi2_s$politcat2 < 5.5] <- 1
#physi2_s$polity_anodummy[physi2_s$politcat2 <= 2.5 | physi2_s$politcat2 >= 5.5] <- 0
#table(physi2_s$polity_anodummy)
#physi2_s$polity_autodummy <- physi2_s$politcat2
#physi2_s$polity_autodummy[physi2_s$politcat2 >= 5.5] <- 1
#physi2_s$polity_autodummy[physi2_s$politcat2 < 5.5] <- 0
#table(physi2_s$polity_autodummy)
#physi2_s$regime <- physi2_s$politcat
#physi2_s$regime[physi2_s$polity_autodummy==1] <- "auto"
#physi2_s$regime[physi2_s$polity_anodummy==1] <- "ano"
#physi2_s$regime[physi2_s$polity_demdummy==1] <- "demo"
#unique(physi2_s$cntry)
table(physi2_s$regime)
qog2000 <- subset(qog,qog$year==2010 |
qog$year==2011 |
qog$year==2012 |
qog$year==2013 |
qog$year==2014 |
qog$year==2015)
table(qog2000$gd_ptsa,qog2000$year)
qog2000$perc2 <- qog2000$gd_ptsa
qog2000$cntry<-countrycode(qog2000$ccodecow, "cown","country.name.en")
qog2000$cntryears <- paste(qog2000$cntry,qog2000$year)
physi2000 <- qog2000 %>% dplyr::select(cntryears, perc2)
combined <- merge(combined, physi2000, by = "cntryears")
physi22000 <- ddply(combined,~cntry,
summarise,terror=mean(perc2,na.rm=T))
combined <- merge(combined, physi22000, by = "cntry")
#table(qog2000$undp_hdi,qog2000$year)
#physiff <- qog2000 %>% dplyr::select(cntryears, undp_hdi)
#combined <- merge(combined, physiff, by = "cntryears")
#physiff2 <- ddply(combined,~cntry,
# summarise,hdi=mean(undp_hdi,na.rm=T))
#combined <- merge(combined, physiff2, by = "cntry")
gni <- read_csv("GNI.csv", skip = 1)
gni$`2015`<-gsub("ttt","",gni$`2015`)
gni$`2015`<-gsub("ff","",gni$`2015`)
gni$`2015`<-gsub("sss","",gni$`2015`)
gni$`2015`<-gsub("uuu","",gni$`2015`)
gni$`2015`<-gsub("o","",gni$`2015`)
gni$`2015` <- as.numeric(gni$`2015`)
gni$`2014`<-gsub("ttt","",gni$`2014`)
gni$`2014`<-gsub("ff","",gni$`2014`)
gni$`2014`<-gsub("sss","",gni$`2014`)
gni$`2014`<-gsub("uuu","",gni$`2014`)
gni$`2014`<-gsub("o","",gni$`2014`)
gni$`2014` <- as.numeric(gni$`2014`)
gni<-gni[,c(2,23:28)]
gni<-gather(as.data.frame(gni),key = "Country")
names(gni) <- c("cntry","year","gni")
gni$cntry<-countrycode(gni$cntry,"country.name.en","country.name.en")
gni$cntryears <- paste(gni$cntry,gni$year)
physigni <- gni %>% dplyr::select(cntryears, gni)
combined <- merge(combined, physigni, by = "cntryears")
physigni2 <- ddply(combined,~cntry,
summarise,gni_c=mean(gni,na.rm=T))
combined <- merge(combined, physigni2, by = "cntry")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExvYWRpbmcgdGhlIFBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQoNCnBfbG9hZCh0aWR5dmVyc2UsIGhhdmVuLHNqbWlzYywNCiAgICAgICAgICAgICAgICAgICAgIGZvcmNhdHMsIHdlaWdodHMsIGNhciwNCiAgICAgICAgICAgICAgICAgICAgIGNvdW50cnljb2RlLCBsYXZhYW4sDQogICAgICAgICAgICAgICAgICAgICBzZW1Ub29scywgbGF2YWFuLnN1cnZleSwNCiAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgcmVzaGFwZTIsIGZhdnN0YXRzKQ0KYGBgDQoNCiMgTG9hZGluZyB0aGUgVVJMcw0KDQpgYGB7cn0NCmFmcm81X3VybCAgICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9hZnJvNS5SRGF0YScpDQphZnJvNl91cmwgICAgICAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYWZybzYuUkRhdGEnKQ0KDQpsYXRpbm8yMDEzX3VybCAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbGF0aW5vMjAxMy5SRGF0YScpDQpsYXRpbm8yMDE1X3VybCAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbGF0aW5vMjAxNS5SRGF0YScpDQoNCnd2c19yYXdfdXJsICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci93dnNfcmF3LlJEYXRhJykNCg0KYW1lcmljYXNfdXJsICAgICA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2FtZXJpY2FzLlJEYXRhJykNCmJvbGl2aWFfdXJsICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9ib2xpdmlhLlJEYXRhJykNCmNhbmFkYV91cmwgICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9jYW5hZGEuUkRhdGEnKQ0KDQphc2lhbl9yYXdfdXJsICAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYXNpYW5fcmF3LlJEYXRhJykNCm15YW5tYXJfcmF3X3VybCAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9teWFubWFyX3Jhdy5SRGF0YScpDQptb25nb2xpYV9yYXdfdXJsIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbW9uZ29saWFfcmF3LlJEYXRhJykNCnBoaWxpcF9yYXdfdXJsICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9waGlsaXBfcmF3LlJEYXRhJykNCnRhaXdhbl9yYXdfdXJsICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci90YWl3YW5fcmF3LlJEYXRhJykNCnRoYWlfcmF3X3VybCAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci90aGFpX3Jhdy5SRGF0YScpDQptYWxheV9yYXdfdXJsICAgIDwtdXJsKCdodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbWFsYXlfcmF3LlJEYXRhJykNCnNpbmdhcG9yZV9yYXdfdXJsPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9zaW5nYXBvcmVfcmF3LlJEYXRhJykNCnNrX3Jhd191cmwgICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9za19yYXcuUkRhdGEnKQ0KY2FtYm9kaWFfcmF3X3VybCA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2NhbWJvZGlhX3Jhdy5SRGF0YScpDQoNCkVTU19yYXdfdXJsICAgICAgPC11cmwoJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9ibG9iL21hc3Rlci9FU1NfcmF3LlJkYXRhP3Jhdz10cnVlJykNCg0KdmRlbXNfc3RhcnRfdXJsICA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3ZkZW1zX3N0YXJ0LlJkYXRhJykNCg0KcW9nX3VybCAgICAgICAgICA8LXVybCgnaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL3FvZy5SZGF0YScpDQoNCmBgYA0KDQoNCiMgQWZyb2Jhcm9tZXRlciBEYXRhDQoNCiMjIEFmcm8gNQ0KDQpgYGB7cn0NCmxvYWQoYWZybzVfdXJsKQ0KDQpkZWxldGVfbmFfYWZybyA8LSBmdW5jdGlvbih4KSB7DQogIHg8LVJlY29kZSh4LCAiOSA9IE5BOw0KICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgIDk5ID0gTkE7DQogICAgICAgICAgICAtMSA9IE5BIikNCiAgcmV0dXJuKHgpDQp9ICNGdW5rdGlvbiB1bSBkaWUgTkFzIGltIEFmcm8gRGF0ZW5zYXR6IHp1IGJlc3RpbW1lbg0KDQojIGFsbGUgVmFyaWFibGVuDQphZnJvXzUgPC0gYWZybzUgICU+JSANCiAgcmVuYW1lKGVkdWMgPSBROTcsICAgICAgICAgICNWYXJpYWJsZW4gdW1iZW5lbm5lbg0KICAgICAgICAgaW5jb21lID0gUTNCLCANCiAgICAgICAgIHNleCA9IFExMDEsIA0KICAgICAgICAgd29yayA9IFE5NiwNCiAgICAgICAgIHRydXN0X2dvdiA9IFE1OUEsDQogICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gUTU5QiwNCiAgICAgICAgIHRydXN0X3BvbGljZSA9IFE1OUgsDQogICAgICAgICB0cnVzdF9jb3VydHMgPSBRNTlKLA0KICAgICAgICAgZGVtdG9kYXkgPSBRNDZBKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yayksIA0KICAgICAgICAgICAgZGVsZXRlX25hX2Fmcm8pICU+JSAgICNOQXMgZGVsZXRlbiANCiAgbXV0YXRlKHNleCA9IHNleCAtIDEsICAgI3NleCAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAgd29yayA9IFJlY29kZSh3b3JrLCAjd29yayAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAgICAgICAgICAgICAgICAiMSA9IDA7DQogICAgICAgICAgICAgICAgICAyID0gMTsNCiAgICAgICAgICAgICAgICAgIDMgPSAxIiksDQogICAgICAgICBhZ2UgPSBSZWNvZGUoUTEsICNtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk5ID0gTkEiKSwNCiAgICAgICAgIGRlbXRvZGF5ID0gUmVjb2RlKGRlbXRvZGF5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgIGVkdWMgPSBSZWNvZGUoZWR1YywNCiAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk5ID0gTkEiKSwNCiAgICAgICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9BTFBIQSksDQogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoREFURUlOVFIsJyVZJykpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpDQoNCmFmcm9fNQ0KYGBgDQoNCiMjIEFmcm8gNg0KDQpgYGB7cn0NCmxvYWQoYWZybzZfdXJsKQ0KDQphZnJvXzYgPC0gYWZybzYgJT4lDQogIHJlbmFtZShlZHVjID0gUTk3LCANCiAgICAgICAgIGluY29tZSA9IFE0QiwgDQogICAgICAgICBzZXggPSBRMTAxLCANCiAgICAgICAgIHdvcmsgPSBROTUsDQogICAgICAgICB0cnVzdF9nb3YgPSBRNTJBLA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IFE1MkIsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSBRNTJILA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gUTUySiwNCiAgICAgICAgIGRlbXRvZGF5ID0gUTQwKSU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCB0cnVzdF9nb3YsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9jb3VydHMsIHdvcmspLCANCiAgICAgICAgICAgIGRlbGV0ZV9uYV9hZnJvKSAlPiUgICAjTkFzIGRlbGV0ZW4gDQogIG11dGF0ZShzZXggPSBzZXggLSAxLCAgICNzZXggKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIHdvcmsgPSBSZWNvZGUod29yaywgI3dvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgIjEgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgMyA9IDEiKSwNCiAgICAgICAgIGFnZSA9IFJlY29kZShRMSwgI21pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgICAgICAgICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICA5OTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICA5OTkgPSBOQSIpLA0KICAgICAgICAgZWR1YyA9IFJlY29kZShlZHVjLA0KICAgICAgICAgICAgICAgICAgICAgICAiLTEgPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgOTkgPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgOTk5ID0gTkEiKSwNCiAgICAgICAgIGRlbXRvZGF5ID0gUmVjb2RlKGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICI4ID0gTkEiKSwNCiAgICAgICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9SNUxpc3QpLA0KICAgICAgICAgeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KERBVEVJTlRSLCclWScpKSkgJT4lDQogIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgDQogICAgICAgICBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KIyAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpDQphZnJvXzYNCg0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQphZnJvX3JlYWwgPC0gYWZyb181ICU+JSBzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZHVjLGluY29tZSxzZXgsYWdlLHdvcmssDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KDQphZnJvX3JlYWwyIDwtIGFmcm9fNiAlPiUgc2VsZWN0KGNudHJ5LHllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cykNCiNsZW5ndGgodW5pcXVlKGFmcm9fcmVhbCRjbnRyeSkpDQojbGVuZ3RoKHVuaXF1ZShhZnJvX3JlYWwyJGNudHJ5KSkNCiN0YWJsZShhZnJvX3JlYWwyJHllYXIpDQoNCmFmcm8gPC0gcmJpbmQoYWZyb19yZWFsLGFmcm9fcmVhbDIpICU+JSBhcy50YmwoKQ0KDQphZnJvDQpgYGANCg0KIyBMYXRpbm8gQmFyb21ldHJvDQoNCiMjIExhdGlubyAyMDEzDQoNCmBgYHtyfQ0KbG9hZChsYXRpbm8yMDEzX3VybCkNCg0KbGF0aW5vXzIwMTMgPC1sYXRpbm8yMDEzICU+JSANCiAgcmVuYW1lKGVkdWMgPSBSRUVEVUNfMSwNCiAgICAgICAgIGluY29tZSA9IFM2LA0KICAgICAgICAgZGVtdG9kYXkgPSBQNTBUR0IuQSwNCiAgICAgICAgIGFnZSA9IFMxMSkgJT4lDQogIG11dGF0ZShzZXggPSBTMTAgLSAxLCAjc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgICAgICAgY250cnkgPSB0b19sYWJlbChJREVOUEEpLCAjY250cnkgdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB0cnVzdF9nb3YgPSA1LVAyNlRHQi5CLA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IDUtUDI2VEdCLkMsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSA1LVAyOFRHQi5CLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gNS1QMjZUR0IuRSwNCiAgICAgICAgIHllYXIgPSAyMDEzLA0KICAgICAgICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICAgICAgIHdvcmsgPSBSZWNvZGUoUzE5LkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiMiA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNiA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgNyA9IDAiKSkgJT4lDQogIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgcmFuZ2UwMSkNCiAgDQpsYXRpbm9fMjAxMw0KYGBgDQoNCiMjIExhdGlubyAyMDE1DQoNCmBgYHtyfQ0KbG9hZChsYXRpbm8yMDE1X3VybCkNCg0KbGF0aW5vXzIwMTUgPC1sYXRpbm8yMDE1ICU+JSANCiAgbXV0YXRlKHNleCA9IFMxMiAtIDEpICU+JSAjc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICByZW5hbWUoZWR1YyA9IFJFRURVQ18xLA0KICAgICAgICAgaW5jb21lID0gUzQsDQogICAgICAgICBkZW10b2RheSA9IFAxN1NUR0JTLA0KICAgICAgICAgYWdlID0gUzEzKSAlPiUNCiAgbXV0YXRlKHRydXN0X2dvdiA9IDUtUDE2U1QuRywNCiAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSA1LVAxNlNULkYsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSA1LVAxNlRHQi5CLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gNS1QMTZTVC5ILA0KICAgICAgICAgd29yayA9IFJlY29kZShTMjEuQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ID0gMCIpLA0KICAgICAgICAgY250cnkgPSB0b19sYWJlbChJREVOUEEpLA0KICAgICAgICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICAgICAgIHllYXIgPSAyMDE1KSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQojICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQojICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTAxKQ0KDQpsYXRpbm9fMjAxNQ0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQpsYXRpbm9fcmVhbCA8LSBsYXRpbm9fMjAxMyAlPiUgc2VsZWN0KGNudHJ5LHllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cykNCg0KbGF0aW5vX3JlYWwyIDwtIGxhdGlub18yMDE1ICU+JSBzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbXRvZGF5LHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KI2xlbmd0aCh1bmlxdWUoYWZyb19yZWFsJGNudHJ5KSkNCiNsZW5ndGgodW5pcXVlKGFmcm9fcmVhbDIkY250cnkpKQ0KI3RhYmxlKGFmcm9fcmVhbDIkeWVhcikNCg0KbGF0aW5vIDwtIHJiaW5kKGxhdGlub19yZWFsLGxhdGlub19yZWFsMikgJT4lIGFzLnRibCgpDQoNCmxhdGlubw0KDQpgYGANCg0KDQoNCiMgV29ybGQgVmFsdWUgU3VydmV5DQoNCmBgYHtyfQ0KbG9hZCh3dnNfcmF3X3VybCkNCg0Kd3ZzIDwtd3ZzX3JhdyAlPiUgDQogIHJlbmFtZShlZHVjID0gVjI0OCwNCiAgICAgICAgIGluY29tZSA9IFYyMzksDQogICAgICAgICBkZW10b2RheSA9IFYxNDEsDQogICAgICAgICBhZ2UgPSBWMjQyLA0KICAgICAgICAgeWVhciA9IFYyNjIpICU+JQ0KICBtdXRhdGUoc2V4ID0gVjI0MCAtMSwgICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB0cnVzdF9nb3YgPSA1LVYxMTUsDQogICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNS1WMTE3LA0KICAgICAgICAgdHJ1c3RfcG9saWNlID0gNS1WMTEzLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gNS1WMTE0LA0KICAgICAgICAgd29yayA9IFJlY29kZShWMjI5LA0KICAgICAgICAgICAgICAgICAgICAgICAiMiA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgIDMgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICA0ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgNSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgIDYgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICA3ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgOCA9IDAiKSwNCiAgICAgICAgIGNudHJ5ID0gdG9fbGFiZWwoVjIpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQogICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQogICAgICAgICAgICBhcy5udW1lcmljKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQogICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQogICAgICAgICAgICByYW5nZTAxKQ0KDQoNCg0Kd3ZzDQpgYGANCg0KIyBBbWVyaWNhcyBCYXJvbWV0ZXINCg0KIyMgQW1lcmljYXMgTWFpbg0KDQpgYGB7cn0NCmxvYWQoYW1lcmljYXNfdXJsKQ0KDQphbWVyaWNhc18gPC0gYW1lcmljYXMgJT4lDQogIG11dGF0ZShjbnRyeSA9IHRvX2xhYmVsKHBhaXMpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LCBvY3VwNGEsIGVkLCBxMTBuZXcsIHExLCBxMiwgDQogICAgICAgICBiMTBhLCBiMTMsIGIxOCwgYjIxYSwgbjMsIHllYXIpICU+JQ0KICByZW5hbWUod29yayA9IG9jdXA0YSwNCiAgICAgICAgIGVkdWMgPSBlZCwNCiAgICAgICAgIGluY29tZSA9IHExMG5ldywNCiAgICAgICAgIHNleCA9IHExLA0KICAgICAgICAgYWdlID0gcTIsDQogICAgICAgICB0cnVzdF9jb3VydHMgPSBiMTBhLA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IGIxMywNCiAgICAgICAgIHRydXN0X3BvbGljZSA9IGIxOCwNCiAgICAgICAgIHRydXN0X2dvdiA9IGIyMWEsDQogICAgICAgICBkZW10b2RheSA9IG4zKSAlPiUNCiAgbXV0YXRlKHNleCA9IHNleCAtMSwgICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB3b3JrID0gUmVjb2RlKHdvcmssDQogICAgICAgICAgICAgICAgICAgICAgIjIgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAzID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgNCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgIDUgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICA2ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgNyA9IDAiKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgcmFuZ2UwMSkNCg0KYW1lcmljYXNfDQpgYGANCg0KDQojIyBCb2xpdmlhDQoNCmBgYHtyfQ0KbG9hZChib2xpdmlhX3VybCkNCg0KYm9saXZpYV8gPC0gYm9saXZpYSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdG9fbGFiZWwocGFpcykpICU+JQ0KICBzZWxlY3QoY250cnksIG9jdXA0YSwgZWQsIHExMG5ldywgcTEsIHEyLCANCiAgICAgICAgIGIxMGEsIGIxMywgYjE4LCBiMjFhLCBuMywgeWVhcikgJT4lDQogIHJlbmFtZSh3b3JrID0gb2N1cDRhLA0KICAgICAgICAgZWR1YyA9IGVkLA0KICAgICAgICAgaW5jb21lID0gcTEwbmV3LA0KICAgICAgICAgc2V4ID0gcTEsDQogICAgICAgICBhZ2UgPSBxMiwNCiAgICAgICAgIHRydXN0X2NvdXJ0cyA9IGIxMGEsDQogICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gYjEzLA0KICAgICAgICAgdHJ1c3RfcG9saWNlID0gYjE4LA0KICAgICAgICAgdHJ1c3RfZ292ID0gYjIxYSwgI3ZpZWxlIG1pc3NpbmcgdmFsdWVzDQogICAgICAgICBkZW10b2RheSA9IG4zKSAlPiUNCiAgbXV0YXRlKHNleCA9IHNleCAtMSwgICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICB3b3JrID0gUmVjb2RlKHdvcmssDQogICAgICAgICAgICAgICAgICAgICAgICIyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgMyA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgIDQgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICA1ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgNiA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgIDcgPSAwIikpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpICAgICAgICANCg0KYm9saXZpYV8NCmBgYA0KDQojIyBDYW5hZGENCg0KYGBge3J9DQpsb2FkKGNhbmFkYV91cmwpDQoNCmNhbmFkYV8gPC0gY2FuYWRhICU+JQ0KICBtdXRhdGUoY250cnkgPSB0b19sYWJlbChwYWlzKSkgJT4lDQogIHNlbGVjdChjbnRyeSwgZXhjMTMsIGVkdWNhdGlvbiwgcTEwLCBxMSwgcTIsIA0KICAgICAgICAgYjEwYSwgYjEzLCBiMTgsIGIyMWEsIG4zLCB5ZWFyKSAlPiUNCiAgcmVuYW1lKHdvcmsgPSBleGMxMywNCiAgICAgICAgIGVkdWMgPSBlZHVjYXRpb24sDQogICAgICAgICBpbmNvbWUgPSBxMTAsDQogICAgICAgICBzZXggPSBxMSwNCiAgICAgICAgIGFnZSA9IHEyLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gYjEwYSwNCiAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBiMTMsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSBiMTgsDQogICAgICAgICB0cnVzdF9nb3YgPSBiMjFhLA0KICAgICAgICAgZGVtdG9kYXkgPSBuMykgJT4lDQogIG11dGF0ZShzZXggPSBzZXggLTEsICAjc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgICAgICAgd29yayA9IHdvcmsgLSAxLA0KICAgICAgICAgaW5jb21lID0gaWZlbHNlKGluY29tZSA9PSA4OCwgTkEsIGluY29tZSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpICAgICAgICANCg0KY2FuYWRhXw0KYGBgDQoNCiMjIE1lcmdpbmcgdGhlIERhdGENCg0KYGBge3J9DQphbWVyaWNhcyA8LSBhbWVyaWNhc18gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbXRvZGF5LHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KDQpib2xpdmlhIDwtIGJvbGl2aWFfICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsaW5jb21lLHNleCxhZ2Usd29yaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdG9kYXksdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cykNCg0KY2FuYWRhIDwtIGNhbmFkYV8gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1YyxpbmNvbWUsc2V4LGFnZSx3b3JrLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW10b2RheSx0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzKQ0KDQoNCmFtZXJpY2FzIDwtIHJiaW5kKGFtZXJpY2FzLGJvbGl2aWEsY2FuYWRhKQ0KDQphbWVyaWNhcw0KYGBgDQoNCiMgQXNpYW4gQmFyb21ldGVyDQoNCmBgYHtyfQ0KbG9hZChhc2lhbl9yYXdfdXJsKQ0KDQpkZWxldGVfbmFfYXNpYW4gPC0gZnVuY3Rpb24oeCkgew0KICB4PC1SZWNvZGUoeCwNCiAgICAgICAgICAgICItMiA9IE5BOw0KICAgICAgICAgICAgNyA9IE5BOw0KICAgICAgICAgICAgOCA9IE5BOw0KICAgICAgICAgICAgOSA9IE5BOw0KICAgICAgICAgICAgOTcgPSBOQTsNCiAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICA5OSA9IE5BOw0KICAgICAgICAgICAgLTEgPSBOQSIpDQogIA0KICByZXR1cm4oeCkNCn0gI0Z1bmt0aW9uIHVtIGRpZSBOQXMgaW0gYXNpYW4gRGF0ZW5zYXR6IHp1IGJlc3RpbW1lbg0KDQphc2lhbl8zIDwtIGFzaWFuX3JhdyAlPiUNCiAgcmVuYW1lKGVkdWMgPSBzZTUsDQogICAgICAgICB0cnVzdF9nb3YgPSBxOSwNCiAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSBxMTQsDQogICAgICAgICB0cnVzdF9jb3VydHMgPSBxOCwNCiAgICAgICAgIHNleCA9IHNlMiwNCiAgICAgICAgIGluY29tZSA9IHNlMTNhLA0KICAgICAgICAgd29yayA9IHNlOSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsIHdvcmssIHNleCksIA0KICAgICAgICAgICAgZGVsZXRlX25hX2FzaWFuKSAlPiUgICAjTkFzIGRlbGV0ZW4gDQogIG11dGF0ZSh0cnVzdF9nb3YgPSA1IC0gdHJ1c3RfZ292LA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IDUgLSB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlID0gNSAtIHRydXN0X3BvbGljZSwNCiAgICAgICAgIHRydXN0X2NvdXJ0cyA9IDUgLSB0cnVzdF9jb3VydHMsDQogICAgICAgICBzZXggPSBzZXggLSAxLCAgICNzZXggKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIGluY29tZSA9IFJlY29kZShpbmNvbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIjAgPSBOQSIpLA0KICAgICAgICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICAgICAgIHdvcmsgPSBSZWNvZGUod29yaywgI3dvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgIjIgPSAwIiksDQogICAgICAgICBhZ2UgPSBSZWNvZGUoc2UzYSwgI21pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgICAgICAgICAgICAgICAiLTEgPSBOQSIpLA0KICAgICAgICAgZGVtdG9kYXkgPSBSZWNvZGUocTkxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICA5NyA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgIGVkdWMgPSBSZWNvZGUoZWR1YywNCiAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICA5OCA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkgPSBOQSIpLA0KICAgICAgICAgY250cnkgPSB0b19sYWJlbChjb3VudHJ5KSwNCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKGZvcm1hdChpcjksJyVZJykpKSAlPiUNCiAgc2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCBkZW10b2RheSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiMgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KIyAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbmNvbWUsIGRlbXRvZGF5LCBlZHVjLCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiAgICAgICAgICAgIHJhbmdlMDEpDQoNCmFzaWFuXzMNCg0KYGBgDQoNCiMjIFdhdmUgNA0KDQpgYGB7cn0NCmxvYWQobXlhbm1hcl9yYXdfdXJsKQ0KDQpuZWVkZWQgPC0gZnVuY3Rpb24gKGRhdGEpIHsNCiAgc3MgPC0gZGF0YSAlPiUNCiAgICByZW5hbWUoZWR1YyA9IHNlNSwNCiAgICAgICAgICAgdHJ1c3RfZ292ID0gcTksDQogICAgICAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgICAgICAgIHRydXN0X3BvbGljZSA9IHExNCwNCiAgICAgICAgICAgdHJ1c3RfY291cnRzID0gcTgsDQogICAgICAgICAgIHNleCA9IHNlMiwNCiAgICAgICAgICAgaW5jb21lID0gc2UxM2EsDQogICAgICAgICAgIHdvcmsgPSBzZTkpICU+JQ0KICAgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaywgc2V4KSwgDQogICAgICAgICAgICAgIGRlbGV0ZV9uYV9hc2lhbikgJT4lICAgI05BcyBkZWxldGVuIA0KICAgIG11dGF0ZSh0cnVzdF9nb3YgPSA1IC0gdHJ1c3RfZ292LA0KICAgICAgICAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgIHRydXN0X3BvbGljZSA9IDUgLSB0cnVzdF9wb2xpY2UsDQogICAgICAgICAgIHRydXN0X2NvdXJ0cyA9IDUgLSB0cnVzdF9jb3VydHMsDQogICAgICAgICAgIHNleCA9IHNleCAtIDEsICAgI3NleCAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAgICBpbmNvbWUgPSBSZWNvZGUoaW5jb21lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAgPSBOQSIpLA0KICAgICAgICAgICB3b3JrID0gUmVjb2RlKHdvcmssICN3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAgICAgICAgICAgICAgICAgICAgIjIgPSAwIiksDQogICAgICAgICAgIGFnZSA9IFJlY29kZShzZTNfMiwgI21pc3NpbmcgdmFsdWVzIGw/c2NoZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICItMSA9IE5BIiksDQogICAgICAgICAgIGRlbXRvZGF5ID0gUmVjb2RlKHE5NCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0xID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICA5NyA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgICAgZWR1YyA9IFJlY29kZShlZHVjLA0KICAgICAgICAgICAgICAgICAgICAgICAgICItMSA9IE5BOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5ID0gTkEiKSwNCiAgICAgICAgICAgY250cnkgPSB0b19sYWJlbChjb3VudHJ5KSwNCiAgICAgICAgICAgeWVhciA9IHllYXIpICU+JQ0KICAgIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpICU+JQ0KIyAgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIGFnZSwNCiMgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KIyAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQojICAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgYWdlLA0KIyAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQojICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCANCiMgICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogICAgbXV0YXRlX2F0KHZhcnMoaW5jb21lLCBkZW10b2RheSwgZWR1YywgDQogICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgICByYW5nZTAxKQ0KICByZXR1cm4oc3MpDQp9DQpteWFubWFyIDwtIG5lZWRlZChteWFubWFyX3JhdykNCg0KbG9hZChtb25nb2xpYV9yYXdfdXJsKQ0KbG9hZChwaGlsaXBfcmF3X3VybCkNCmxvYWQodGFpd2FuX3Jhd191cmwpDQpsb2FkKHRoYWlfcmF3X3VybCkNCmxvYWQobWFsYXlfcmF3X3VybCkNCmxvYWQoc2luZ2Fwb3JlX3Jhd191cmwpDQpsb2FkKHNrX3Jhd191cmwpDQpsb2FkKGNhbWJvZGlhX3Jhd191cmwpDQoNCm1vbmdvbGlhIDwtIG5lZWRlZChtb25nb2xpYV9yYXcpDQpwaGlsaXAgPC0gbmVlZGVkKHBoaWxpcF9yYXcpDQp0YWl3YW4gPC0gbmVlZGVkKHRhaXdhbl9yYXcpDQp0aGFpIDwtIG5lZWRlZCh0aGFpX3JhdykNCm1hbGF5IDwtIG5lZWRlZChtYWxheV9yYXcpDQpzaW5nYXBvcmUgPC0gbmVlZGVkKHNpbmdhcG9yZV9yYXcpICNTaW5nYXBvcmUgaGF0IGV4dHJlbSB2aWVsZSBNaXNzaW5nIHZhbHVlcw0Kc2sgPC0gbmVlZGVkKHNrX3JhdykNCmNhbWJvZGlhIDwtIG5lZWRlZChjYW1ib2RpYV9yYXcpDQoNCmFzaWFuPC0gcmJpbmQoYXNpYW5fMyxteWFubWFyLGNhbWJvZGlhLHNrLHNpbmdhcG9yZSxtYWxheSx0aGFpLHRhaXdhbixwaGlsaXAsDQogICAgICAgICAgICAgICBjYW1ib2RpYSxtb25nb2xpYSkgJT4lIGFzLnRibCgpDQoNCmFzaWFuDQoNCmBgYA0KDQoNCiMgRXVyb3BlYW4gU29jaWFsIFN1cnZleQ0KDQpgYGB7cn0NCmxvYWQoRVNTX3Jhd191cmwpDQoNCkVTUyA8LUVTU19yYXcgJT4lIA0KICByZW5hbWUoZGVtdG9kYXkgPSBkbWNudG92LA0KICAgICAgICAgYWdlID0gYWdlYSwNCiAgICAgICAgIHllYXIgPSBpbnd5eXMsDQogICAgICAgICB0cnVzdF9nb3YgPSB0cnN0cGx0LA0KICAgICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IHRyc3RwcmwsDQogICAgICAgICB0cnVzdF9wb2xpY2UgPSB0cnN0cGxjLA0KICAgICAgICAgdHJ1c3RfY291cnRzID0gdHJzdGxnbCkgJT4lDQogIG11dGF0ZShpbmNvbWUgPSA1IC0gaGluY2ZlbCwNCiAgICAgICAgIGVkdWMgPSBSZWNvZGUoZWlzY2VkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiNTUgPSBOQSIpLA0KICAgICAgICAgd29yayA9IGlmZWxzZShtbmFjdGljID09IDEsIDEsIDApLA0KICAgICAgICAgc2V4ID0gZ25kciAtIDEsICNzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgICAgICBjbnRyeSA9IHRvX2xhYmVsKGNudHJ5KSkgJT4lDQogIHNlbGVjdChjbnRyeSx5ZWFyLGFnZSxzZXgsIGluY29tZSwgZWR1Yywgd29yaywgZGVtdG9kYXksIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMuY2hhcmFjdGVyKSAlPiUNCiMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KIyAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgDQojICAgICAgICAgICAgYXMubnVtZXJpYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgc3RkeikgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZGVtdG9kYXksIGVkdWMsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cyksIA0KICAgICAgICAgICAgcmFuZ2UwMSkNCg0KDQpFU1MNCmBgYA0KDQoNCiMgTWVyZ2luZyBFdmVyeXRoaW5nDQoNCmBgYHtyfQ0KRVNTJHN1cnZleSA8LSByZXAoIkVTUyIsbnJvdyhFU1MpKQ0KYXNpYW4kc3VydmV5IDwtIHJlcCgiYXNpYW4iLG5yb3coYXNpYW4pKQ0KYW1lcmljYXMkc3VydmV5IDwtIHJlcCgiYW1lcmljYXMiLG5yb3coYW1lcmljYXMpKQ0Kd3ZzJHN1cnZleSA8LSByZXAoInd2cyIsbnJvdyh3dnMpKQ0KbGF0aW5vJHN1cnZleSA8LSByZXAoImxhdGlubyIsbnJvdyhsYXRpbm8pKQ0KYWZybyRzdXJ2ZXkgPC0gcmVwKCJhZnJvIixucm93KGFmcm8pKQ0KDQoNCmFtZXJpY2FzJGNudHJ5IDwtIGFzLmNoYXJhY3RlcihhbWVyaWNhcyRjbnRyeSkNCmFtZXJpY2FzJGNudHJ5W2FtZXJpY2FzJGNudHJ5PT0iSGFpdD8iXSA8LSAiSGFpdGkiDQoNCg0KYW1lcmljYXMkY250cnk8LWNvdW50cnljb2RlKGFtZXJpY2FzJGNudHJ5LCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0Kd3ZzJGNudHJ5PC1jb3VudHJ5Y29kZSh3dnMkY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpsYXRpbm8kY250cnk8LWNvdW50cnljb2RlKGxhdGlubyRjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCmFmcm8kY250cnk8LWNvdW50cnljb2RlKGFmcm8kY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQphc2lhbiRjbnRyeTwtY291bnRyeWNvZGUoYXNpYW4kY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpFU1MkY250cnk8LWNvdW50cnljb2RlKEVTUyRjbnRyeSwiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikNCg0KdW5pcXVlKEVTUyRjbnRyeSkNCnVuaXF1ZShhc2lhbiRjbnRyeSkNCnVuaXF1ZSh3dnMkY250cnkpDQp1bmlxdWUobGF0aW5vJGNudHJ5KQ0KdW5pcXVlKGFtZXJpY2FzJGNudHJ5KQ0KdW5pcXVlKGFmcm8kY250cnkpDQoNCnd2cyA8LSB3dnMgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhZ2Usc2V4LCBpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZHVjLCB3b3JrLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsc3VydmV5KQ0KDQpsYXRpbm8gPC0gbGF0aW5vICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLHN1cnZleSkNCg0KDQphZnJvIDwtIGFmcm8gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhZ2Usc2V4LCBpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsc3VydmV5KQ0KDQoNCmFtZXJpY2FzIDwtIGFtZXJpY2FzICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWMsIHdvcmssIGRlbXRvZGF5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLHN1cnZleSkNCg0KYXNpYW4gPC0gYXNpYW4gJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixhZ2Usc2V4LCBpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMsc3VydmV5KQ0KDQpFU1MgPC0gRVNTICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWdlLHNleCwgaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Yywgd29yaywgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLHN1cnZleSkNCg0KDQptZXJnZWQgPC0gcmJpbmQod3ZzLGxhdGlubyxhZnJvLGFtZXJpY2FzLGFzaWFuLEVTUykNCg0KbWVyZ2VkIDwtIG1lcmdlZCAlPiUNCiAgI2NyZWF0ZSBkdW1taWVzDQogIG11dGF0ZSh3dnMgICAgID0gaWZlbHNlKHN1cnZleT09Ind2cyIsMSwgMCksDQogICAgICAgIGFmcm8gICAgID0gaWZlbHNlKHN1cnZleT09ImFmcm8iLDEsIDApLA0KICAgICAgICBsYXRpbm8gICA9IGlmZWxzZShzdXJ2ZXk9PSJsYXRpbm8iLDEsIDApLA0KICAgICAgICBhbWVyaWNhcyA9IGlmZWxzZShzdXJ2ZXk9PSJhbWVyaWNhcyIsMSwgMCksDQogICAgICAgIGFzaWFuICAgID0gaWZlbHNlKHN1cnZleT09ImFzaWFuIiwxLCAwKSwNCiAgICAgICAgRVNTICAgICAgPSBpZmVsc2Uoc3VydmV5PT0iRVNTIiwxLCAwKQ0KICAgICAgICApICU+JQ0KICAjZmlsdGVyIGJhZCBjb3VudHJpZXMNCiAgZmlsdGVyKGNudHJ5IT0iRWd5cHQiKSAlPiUgI2V4Y2x1ZGUgRWd5cHQgMjAxMw0KICBmaWx0ZXIoY250cnkhPSJMaWJ5YSIpICU+JSAjZXhjbHVkZSBMaWJ5YSAyMDE0DQogIGZpbHRlcihjbnRyeSE9Ik1hbGkiKSAlPiUgI2V4Y2x1ZGUgTWFsaSAyMDEyDQogIGZpbHRlcihjbnRyeSE9IlllbWVuIikgJT4lICNleGNsdWRlIFllbWVuIDIwMTINCiAgZmlsdGVyKGNudHJ5IT0iUGFsZXN0aW5lLCBTdGF0ZSBvZiIpICNleGNsdWRlIFBhbGVzdGluZSAyMDEzDQoNCiAgICAjIGFkZGluZyB3ZWlnaHQNCm1lcmdlZCA8LSBtZXJnZWQgJT4lDQogIGdyb3VwX2J5KGNudHJ5KSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgbXV0YXRlKHdlaWdodCA9IDEwMDAvbikgJT4lDQogIHNlbGVjdChjbnRyeSwgd2VpZ2h0KSAlPiUNCiAgbGVmdF9qb2luKG1lcmdlZCwgImNudHJ5IikNCiMgc2VsZWN0KGNudHJ5LCB5ZWFyKSAlPiUNCiMgdW5pcXVlICU+JQ0KIyBWaWV3DQoNCm1lcmdlZA0KDQp0YWJsZShtZXJnZWQkd3ZzKQ0KdGFibGUobWVyZ2VkJGFmcm8pDQp0YWJsZShtZXJnZWQkbGF0aW5vKQ0KdGFibGUobWVyZ2VkJGFtZXJpY2FzKQ0KdGFibGUobWVyZ2VkJGFzaWFuKQ0KdGFibGUobWVyZ2VkJEVTUykNCmBgYA0KDQoNCg0KIyMgU0VNIEluZGV4DQoNCmBgYHtyfQ0KbWVyZ2VkMiA8LSBtZXJnZWQgJT4lDQogIG11dGF0ZShnb3ZfdHJ1c3QgPSB0cnVzdF9nb3YgKyB0cnVzdF9wYXJsaWFtZW50ICsgDQogICAgICAgICAgIHRydXN0X3BvbGljZSArIHRydXN0X2NvdXJ0cykgJT4lDQogIGZpbHRlcighaXMubmEoZ292X3RydXN0KSkNCg0KbWVyZ2VkMyA8LSBtZXJnZWQgJT4lDQogIG11dGF0ZShnb3ZfdHJ1c3QgPSB0cnVzdF9nb3YgKyB0cnVzdF9wYXJsaWFtZW50ICsgDQogICAgICAgICAgIHRydXN0X3BvbGljZSArIHRydXN0X2NvdXJ0cykgJT4lDQogIGZpbHRlcihpcy5uYShnb3ZfdHJ1c3QpKQ0KDQpzdnkuZGYgPC0gc3VydmV5OjpzdnlkZXNpZ24oaWQ9IH4xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cz0gfndlaWdodCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9IG1lcmdlZCkgDQoNCm1vZGVsIDwtICcjIG1lYXN1cmVtZW50IG1vZGVsIDENCmdvdl90cnVzdDIgPX4gMSp0cnVzdF9nb3YgKyB0cnVzdF9wYXJsaWFtZW50ICsgDQp0cnVzdF9wb2xpY2UgKyB0cnVzdF9jb3VydHMNCnRydXN0X2dvdiB+fiB0cnVzdF9wYXJsaWFtZW50DQonDQoNCm1lcmdlZCA8LSBtZXJnZWQgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMpLCBhcy5udW1lcmljKQ0KDQojIGNvcihuYS5vbWl0KGRhdGEuZnJhbWUobWVyZ2VkJHRydXN0X2dvdiwNCiMgICAgICAgICAgICAgICBtZXJnZWQkdHJ1c3RfcG9saWNlLA0KIyAgICAgICAgICAgICAgIG1lcmdlZCR0cnVzdF9jb3VydHMsDQojICAgICAgICAgICAgICAgbWVyZ2VkJHRydXN0X3BhcmxpYW1lbnQsDQojICAgICAgICAgICAgICAgbWVyZ2VkJGRlbXRvZGF5KSkpDQoNCmxhdmFhbl9tb2RlbDE8LWNmYShtb2RlbCwgbWVhbnN0cnVjdHVyZSA9IFQsIA0KICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhcy5kYXRhLmZyYW1lKG1lcmdlZCksDQogICAgICAgICAgICAgICAgICAgZXN0aW1hdG9yPSAiTUxNIikNCg0KZml0X2ExPC1sYXZhYW4uc3VydmV5KGxhdmFhbl9tb2RlbDEsIA0KICAgICAgICAgICAgZXN0aW1hdG9yPSAiTUxNIiwgc3VydmV5LmRlc2lnbj1zdnkuZGYpDQpzdW1tYXJ5KGZpdF9hMSwgc3RhbmRhcmRpemVkPVRSVUUsZml0Lm1lYXN1cmVzID0gVFJVRSwgcnNxID0gVCkNCg0KbWVyZ2VkNDwtY2JpbmQobWVyZ2VkMiwgcHJlZGljdChmaXRfYTEsIG5ld2RhdGEgPSBtZXJnZWQyKSkNCm1lcmdlZDQkZ292X3RydXN0MjwtcmFuZ2UwMShtZXJnZWQ0JGdvdl90cnVzdDIpDQoNCiMgaGVhZChtZXJnZWQ0KQ0KDQptZXJnZWQ8LXBseXI6OnJiaW5kLmZpbGwobWVyZ2VkMyxtZXJnZWQ0KQ0KbWVyZ2VkJGdvdl90cnVzdDwtbWVyZ2VkJGdvdl90cnVzdDINCmhlYWQobWVyZ2VkKQ0KYGBgDQoNCg0KIyMgU29tZSBSZWNvZGluZw0KDQpgYGB7cn0NCnRhYmxlKG1lcmdlZCRjbnRyeSxtZXJnZWQkeWVhcikNCg0KdGFibGUoc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJDaGluYSIpJHN1cnZleSwNCiAgICAgIHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiKSR5ZWFyKQ0KDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAxNTgzXSA8LSAyMDExDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDAwXSA8LSAyMDExDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDc3XSA8LSAyMDExDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDEyXSA8LSAyMDExDQoNCnRhYmxlKHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iU2luZ2Fwb3JlIikkc3VydmV5LA0KICAgICAgc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJTaW5nYXBvcmUiKSR5ZWFyKQ0KDQptZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJTaW5nYXBvcmUiICYgbWVyZ2VkJHllYXIgPT0gMTU4Ml0gPC0gMjAxMQ0KDQpoaXN0KG1lcmdlZCRnb3ZfdHJ1c3QpDQpgYGANCg0KDQoNCg0KIyBMZXZlbCAyIERhdGENCg0KIyMgVi1EZW0NCg0KYGBge3J9DQpsb2FkKHZkZW1zX3N0YXJ0X3VybCkNCg0KdmRlbXNfc3ViIDwtIHZkZW1zX3N0YXJ0ICU+JSBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkNCg0KI3RpYmJsZShpZCA9IDE6MTg5NikNCiN0YWJsZSh2ZGVtc19zdWIkY291bnRyeV9uYW1lKQ0KDQp2ZGVtIDwtIHZkZW1zX3N0YXJ0ICU+JQ0KICBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkgJT4lIA0KICBncm91cF9ieShjb3VudHJ5X25hbWUpICU+JQ0KICB0YWxseSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdW5pcXVlKGNvdW50cnlfbmFtZSkpICU+JQ0KICAjRENJIFZhcmlhYmxlcw0KICBtdXRhdGUoZGVsaWIxMCA9IHZkZW1zX3N1YiAlPiUNCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhkbF9kZWxpYiIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShjb25zdWx0MTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxjb25zbHQiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocmVhc29uMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxyZWFzb24iKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29tbW9uMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxjb21tb24iKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY291bnRyMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxjb3VudHIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZW5nYWdlMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyZGxlbmdhZ2UiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZGVsaWJkZW0xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X2RlbGliZGVtIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgIyBDb250cm9sIFZhcmlhYmxlcw0KICBtdXRhdGUocG9saXR5MTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfZmhfaXBvbGl0eTIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZ2RwMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfR0RQX1Blcl9DYXBfSGFiZXJfTWVuXzIiKSkgJT4lICNISUVSIE3DnFNTVEUgTUFOIDggSkFIUkUgR0RQIGF1c3fDpGhsZW4NCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShyaXcxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV92MnhfcmVnaW1lX2NpIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvcmVjaXZpbDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2Mnhjc19jY3NpIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHBvcDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX21pcG9wdWxhIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvcnJ1cHRpb24xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X2NvcnIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocG9sa2lsbDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhfY2xwaHkiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZWR1YzEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3BlYXZlZHVjIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGdpbmkxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV9wZWdpbml3aSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lIA0KICAjIER1bW15IHZhcmlhYmxlcw0KICBtdXRhdGUocG9sX3JvdW5kID0gcm91bmQocG9saXR5MTAgKiAyIC0xMCkpICU+JSANCiAgbXV0YXRlKHBvbGl0eV9kZW1kdW1teSA9IGlmZWxzZShwb2xfcm91bmQgPiA1LCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocG9saXR5X2Fub2R1bW15ID0gaWZlbHNlKHBvbF9yb3VuZCA+PSAtNSAmIHBvbF9yb3VuZCA8PSA1LCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocG9saXR5X2F1dG9kdW1teSA9IGlmZWxzZShwb2xfcm91bmQgPCAtNSwgMSwgMCkpICU+JSANCiAgbXV0YXRlKHJlZ2ltZSA9IGNhc2Vfd2hlbigNCiAgICBwb2xpdHlfYXV0b2R1bW15ID09IDEgfiAiYXV0byIsDQogICAgcG9saXR5X2Fub2R1bW15ID09IDEgfiAiYW5vIiwNCiAgICBwb2xpdHlfZGVtZHVtbXkgPT0gMSB+ICJkZW1vIg0KICAgICkNCiAgKSAlPiUNCiAgbXV0YXRlKHJlZ2ltZSA9IGZhY3RvcihyZWdpbWUsIGxldmVscyA9IGMoImRlbW8iLCAiYW5vIiwgImF1dG8iKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpKQ0KDQp2ZGVtJGNudHJ5WzQwXSA8LSAiVmlldCBOYW0iDQoNCg0KIyBpZmVsc2Uocm91bmQodmRlbSRwb2xpdHkxMCAqIDIgLTEwKSA+PSAtNSAmIHJvdW5kKHZkZW0kcG9saXR5MTAgKiAyIC0xMCkgPD0gNSwgMSwgMCkNCg0KdGFibGUodmRlbSRyZWdpbWUpDQpwcmludChsZXZlbHModmRlbSRyZWdpbWUpKSANCg0KDQoNCiAgDQpgYGANCg0KIyMjIFRvIERvIC0gUmVnaW9ucw0KDQpgYGB7cn0NCiAgbXV0YXRlKHJlZ2lvbnMgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogICAgICAgICAgIG11dGF0ZShyZWdpb25zID0gZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpICAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfZmFjdG9yKSkgICU+JQ0KICAgICAgICAgICBzZWxlY3QocmVnaW9ucykNCg0KDQp0YWJsZShyZWdpb25zKQ0KDQpyZWdpb25zMiA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIHRyYW5zbXV0ZShmY3RfcmVjb2RlKGFzLmZhY3RvcihgMjAwMGApLA0KICAgICAgICAgICAgICAgICAgICAgICAiRS4gRXVyb3BlIGFuZCBDLiBBc2lhIChwb3N0LUNvbW11bmlzdCkiID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMiIsDQogICAgICAgICAgICAgICAgICAgICAgICJNRU5BIiA9ICIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlN1Yi1TYWhhcmFuIEFmcmljYSIgPSAiNCIsDQogICAgICAgICAgICAgICAgICAgICAgICJXLiBFdXJvcGUgYW5kIE4uIEFtZXJpY2EiID0gIjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAiRWFzdCBBc2lhIiA9ICI2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoLUVhc3QgQXNpYSIgPSAiNyIsDQogICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCBBc2lhIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlBhY2lmaWMiID0gIjkiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMTAiKSkNCg0KdGFibGUocmVnaW9uczIpDQoNCnJlZ2lvbnMzIDwtIGRjYXN0KHZkZW1zX3N1YiwgY291bnRyeV9uYW1lIH4geWVhciwgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpJCIyMDAwIg0KDQpwb3N0Y29tICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAxKQ0KbGF0aW4gICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMiB8IHJlZ2lvbnMzID09IDEwKQ0KbWVuYSAgICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMykNCnN1YnNhaGFyYSA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDQpDQp3ZXN0ICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA1KQ0KZS5hc2lhICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNikNCnMuZS5hc2lhICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDcpDQpzLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA4KQ0KcGFjaWZpYyAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gOSkNCg0KDQp3dyA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIG11dGF0ZShyZWdpb25zID0gZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX2ZhY3RvcigpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHJlZ2lvbnMpDQoNCnd3DQoNCnJlZ2lvbnMyIDwtIHZkZW1zX3N1YiAlPiUgDQogIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkgJT4lDQogIHNlbGVjdCgnMjAwMCcpICU+JSANCiAgdHJhbnNtdXRlKGZjdF9yZWNvZGUoYXMuZmFjdG9yKGAyMDAwYCksDQogICAgICAgICAgICAgICAgICAgICAgICJFLiBFdXJvcGUgYW5kIEMuIEFzaWEgKHBvc3QtQ29tbXVuaXN0KSIgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIk1FTkEiID0gIjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU3ViLVNhaGFyYW4gQWZyaWNhIiA9ICI0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlcuIEV1cm9wZSBhbmQgTi4gQW1lcmljYSIgPSAiNSIsDQogICAgICAgICAgICAgICAgICAgICAgICJFYXN0IEFzaWEiID0gIjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU291dGgtRWFzdCBBc2lhIiA9ICI3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoIEFzaWEiID0gIjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAiUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKQ0KDQp0YWJsZShyZWdpb25zMikNCg0KcmVnaW9uczMgPC0gZGNhc3QodmRlbXNfc3ViLCBjb3VudHJ5X25hbWUgfiB5ZWFyLCB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkkIjIwMDAiDQoNCnBvc3Rjb20gICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDEpDQpsYXRpbiAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAyIHwgcmVnaW9uczMgPT0gMTApDQptZW5hICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAzKQ0Kc3Vic2FoYXJhIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNCkNCndlc3QgICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDUpDQplLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA2KQ0Kcy5lLmFzaWEgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNykNCnMuYXNpYSAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDgpDQpwYWNpZmljICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA5KQ0KDQoNCg0KYGBgDQoNCg0KIyMgUW9HDQoNCmBgYHtyfQ0KbG9hZChxb2dfdXJsKQ0KDQpxb2cxMCA8LSBxb2cgJT4lIA0KICBmaWx0ZXIoeWVhciAlaW4lIDIwMDA6MjAxMCkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKSkNCg0KcW9nMTAgPC0gcW9nICU+JSANCiAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikpICU+JSANCiAgZ3JvdXBfYnkoY250cnkpICU+JQ0KICB0YWxseSgpICU+JSANCiAgbXV0YXRlKGV0aG5pYzEwID0gcW9nMTAgJT4lDQogICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJhbF9ldGhuaWMiKSwgDQogICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogIHNlbGVjdCgtbikNCiMgIG11dGF0ZShhbF9ldGhuaWMgPSBhcy5udW1lcmljKGFsX2V0aG5pYykpICU+JSANCg0KcW9nMTANCg0KDQoNCmBgYA0KDQojIyBNZXJnaW5nIFRpbWUNCg0KIyMjIExldmVsIDINCg0KYGBge3J9DQpsZXZlbDIgPC0gbWVyZ2UoeD1xb2cxMCwgeT12ZGVtLCBieT0iY250cnkiKQ0KDQpsZXZlbDINCmBgYA0KDQojIyMgSW5kICsgQ291bnRyeQ0KDQpgYGB7cn0NCg0KY29tYmluZWQgPC0gbWVyZ2UoeD1tZXJnZWQsIHk9bGV2ZWwyLCBieT0iY250cnkiKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShjbnRyeWVhcnMgPSBwYXN0ZShjbnRyeSwgeWVhcikpDQoNCiNjb21iaW5lZCRjbnRyeWVhcnMgPC0gcGFzdGUoY29tYmluZWQkY250cnksY29tYmluZWQkeWVhcikNCg0KDQp2ZGVtMiA8LSB2ZGVtc19zdGFydCAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSAyMDEwOjIwMTUpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY291bnRyeV9uYW1lLCJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSkgIyU+JSANCiAjIHNlbGVjdChjbnRyeSwgY291bnRyeV9uYW1lKQ0KDQp2ZGVtMiRjbnRyeVs5OTZdIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5Wzk5N10gPC0gIlZpZXQgTmFtIg0KdmRlbTIkY250cnlbOTk4XSA8LSAiVmlldCBOYW0iDQp2ZGVtMiRjbnRyeVs5OTldIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5WzEwMDBdIDwtICJWaWV0IE5hbSINCnZkZW0yJGNudHJ5WzEwMDFdIDwtICJWaWV0IE5hbSINCg0KY29tYmluZWQgPC0gdmRlbTIgJT4lIA0KICBtdXRhdGUoY250cnllYXJzID0gcGFzdGUoY250cnksIHllYXIpKSAlPiUgDQogIG11dGF0ZShkaXNjdXNzX3Vuc2VsID0gdjJ4Y2xfZGlzYykgJT4lIA0KICBzZWxlY3QoY250cnllYXJzLCBkaXNjdXNzX3Vuc2VsKSAlPiUgDQogIG1lcmdlKGNvbWJpbmVkLCBieSA9ICJjbnRyeWVhcnMiKSAlPiUgDQogICAgICAgICAgICAgICAgICBwbHlyOjpkZHBseSh+Y250cnksDQogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3VzcyA9IG1lYW4oZGlzY3Vzc191bnNlbCwgbmEucm09VCkpICU+JSANCiAgbWVyZ2UoY29tYmluZWQsIGJ5ID0gImNudHJ5IikNCg0KDQpjb21iaW5lZA0KDQoNCnNhdmUoY29tYmluZWQsZmlsZT0iY29tYmluZWQuUmRhdGEiKQ0Kc2F2ZShsZXZlbDIsZmlsZT0ibGV2ZWwyLlJkYXRhIikNCmBgYA0KDQoNCiMgV2VpZ2h0aW5nDQoNCiMjIE1hY3JvIExldmVsDQoNCmBgYHtyfQ0KDQptYWNybyAgPC0gY29tYmluZWQgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShnb3ZfdHJ1c3QgPSByYW5nZTAxKGdvdl90cnVzdCkqMTAwKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGRlbXRvZGF5ID0gcmFuZ2UwMShkZW10b2RheSkqMTAwKSAlPiUgDQogICAgICAgICAgICAgICAgcGx5cjo6ZGRwbHkofmNudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbl9nb3YgPSBtZWFuKGdvdl90cnVzdCwgbmEucm09VCksDQogICAgICAgICAgICAgICAgICAgICBtZWFuX2RlbSA9IG1lYW4oZGVtdG9kYXksIG5hLnJtPVQpLA0KICAgICAgICAgICAgICAgICAgICAgZGlzY3VzcyA9IG1lYW4oZGlzY3VzcywgbmEucm09VCkpICU+JSANCiMgICAgICAgICAgICAgICAgICAgICBwb2xpdHkxMCA9IG1lYW4ocG9saXR5MTAsIG5hLnJtPVQpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBvbGl0eV9kZW1kdW1teSA9IG1lYW4ocG9saXR5X2RlbWR1bW15LCBuYS5ybT1UKSkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShkaXNjdXNzX3JvdW5kID0gcm91bmQoZGlzY3Vzcyo0KSkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShtZWFuX2dvdl9sb3cgPSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAyIH4gbWVhbl9nb3YgKiAuOSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDEgfiBtZWFuX2dvdiAqIC44NSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kICVpbiUgYygzLDQpIH4gbWVhbl9nb3YpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKG1lYW5fZ292X2hpZ2ggPSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAyIH4gbWVhbl9nb3YgKiAuOCwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDEgfiBtZWFuX2dvdiAqIC43NSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kICVpbiUgYygzLDQpIH4gbWVhbl9nb3YpKSAlPiUgDQogICAgICAgICAgICAgICAgbWVyZ2UobGV2ZWwyLCBieSA9ICJjbnRyeSIpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQodmFycyhjb21tb24xMCwgcmVhc29uMTAsIGNvbnN1bHQxMCwgDQogICAgICAgICAgICAgICAgIGNvdW50cjEwLCBlbmdhZ2UxMCwgZW5nYWdlMTAsIGRlbGliMTApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlMDEpDQoNCm1hY3JvX2RlbSA8LSBtYWNybyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHBvbGl0eV9kZW1kdW1teSA9PSAxKQ0KDQptYWNyb19hdXQgPC0gbWFjcm8gJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihwb2xpdHlfZGVtZHVtbXkgPT0gMCkNCg0KIyB0YWJsZV9zdHVmZjI8LXN1YnNldCh0YWJsZV9zdHVmZiwNCiMgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKHRhYmxlX3N0dWZmJHJlZ2ltZSkgJg0KIyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX3N0dWZmJGNudHJ5IT0iUWF0YXIiICYNCiMgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX3N0dWZmJGNudHJ5IT0iVXpiZWtpc3RhbiIpDQoNCg0Kc2F2ZShtYWNybywgZmlsZT0ibWFjcm8uUmRhdGEiKQ0Kc2F2ZShtYWNyb19kZW0sIGZpbGU9Im1hY3JvX2RlbS5SZGF0YSIpDQpzYXZlKG1hY3JvX2F1dCwgZmlsZT0ibWFjcm9fYXV0LlJkYXRhIikNCg0KYGBgDQoNCiMjIEluZGl2aWR1YWwgTGV2ZWwNCg0KYGBge3J9DQpjb21iaW5lZCAgPC0gY29tYmluZWQgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShkaXNjdXNzX3JvdW5kID0gcm91bmQoZGlzY3Vzcyo0KSkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShnb3ZfdHJ1c3RfbG93ID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMiB+IGdvdl90cnVzdCAqIC45LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgPT0gMSB+IGdvdl90cnVzdCAqIC44NSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kICVpbiUgYygzLDQpIH4gZ292X3RydXN0KSkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShnb3ZfdHJ1c3RfaGlnaCA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDIgfiBnb3ZfdHJ1c3QgKiAuOCwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDEgfiBnb3ZfdHJ1c3QgKiAuNzUsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCAlaW4lIGMoMyw0KSB+IGdvdl90cnVzdCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGVfYXQodmFycyhjb21tb24xMCwgcmVhc29uMTAsIGNvbnN1bHQxMCwgDQogICAgICAgICAgICAgICAgIGNvdW50cjEwLCBlbmdhZ2UxMCwgZW5nYWdlMTAsIGRlbGliMTApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlMDEpDQoNCnNhdmUoY29tYmluZWQsZmlsZT0iY29tYmluZWQuUmRhdGEiKQ0KDQpgYGANCg0KDQojIENyYXANCg0KYGBge3J9DQoNCmNvbXBhcmVfY250cnk8LWRhdGEuZnJhbWUodGFibGUobWVyZ2VkJGNudHJ5LG1lcmdlZCR5ZWFyKSkNCmNvbXBhcmVfY250cnk8LXRpZHlyOjpzcHJlYWQoY29tcGFyZV9jbnRyeSxWYXIyLEZyZXEpDQpjb21wYXJlX2NudHJ5W2NvbXBhcmVfY250cnk9PTBdPC0xMDAwMDANCiNjb21wYXJlX2NudHJ5PC1uYS5vbWl0KGNvbXBhcmVfY250cnkpDQppbmRpZTwtYXMubnVtZXJpYyhhcHBseShjb21wYXJlX2NudHJ5WywtMV0sMSxzdW0pKQ0KY29tcGFyZV9jbnRyeSRkb3VibGU8LWluZGllPDkwMDAwMA0KY29tcGFyZV9jbnRyeVtjb21wYXJlX2NudHJ5PT0xMDAwMDBdPC0wDQpjb21wYXJlX2NudHJ5MiA8LSBzdWJzZXQoY29tcGFyZV9jbnRyeSxjb21wYXJlX2NudHJ5JGRvdWJsZT09VFJVRSkNCg0KY29tcGFyZV9jbnRyeTMgPC0gc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnkgJWluJSBjb21wYXJlX2NudHJ5MiRWYXIxKQ0KDQp5MTwtc3Vic2V0KGNvbXBhcmVfY250cnkzLGNvbXBhcmVfY250cnkzJGNudHJ5PT0iQmVsaXplIiAmDQogICAgICAgICAgICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMikkZ292X3RydXN0DQoNCnkyPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCZWxpemUiICYNCiAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTQpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCb2xpdmlhIChQbHVyaW5hdGlvbmFsIFN0YXRlIG9mKSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTIpJGdvdl90cnVzdA0KDQp5Mjwtc3Vic2V0KGNvbXBhcmVfY250cnkzLGNvbXBhcmVfY250cnkzJGNudHJ5PT0iQm9saXZpYSAoUGx1cmluYXRpb25hbCBTdGF0ZSBvZikiICYNCiAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDEzKSRnb3ZfdHJ1c3QNCg0KdC50ZXN0KHkxLHkyKQ0KDQp5MTwtc3Vic2V0KGNvbXBhcmVfY250cnkzLGNvbXBhcmVfY250cnkzJGNudHJ5PT0iU291dGggQWZyaWNhIiAmDQogICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMSkkZ292X3RydXN0DQoNCnkyPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJTb3V0aCBBZnJpY2EiICYNCiAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDEzKSRnb3ZfdHJ1c3QNCg0KdC50ZXN0KHkxLHkyKQ0KDQogICAgICAgDQpzdWJzZXQobWVyZ2VkLG1lcmdlZCR5ZWFyPT0yMDEyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KY29tcGFyZV9jbnRyeTQgPC0gY29tcGFyZV9jbnRyeTMgJT4lDQogIGdyb3VwX2J5KGNudHJ5LHllYXIpICU+JQ0KICBzdW1tYXJpc2VfYWxsKGZ1bnMobWVhbiguLCBuYS5ybT1UUlVFKSkpDQoNCmNvbXBhcmVfY250cnk0JGNudHJ5ZWFyPC1wYXN0ZShjb21wYXJlX2NudHJ5NCRjbnRyeSxjb21wYXJlX2NudHJ5NCR5ZWFyKQ0KICANCmFzLmRhdGEuZnJhbWUoY29tcGFyZV9jbnRyeTRbLGMoMTcsOCldKQ0KICANCj9kZHBseQ0KaGVhZChhZnJvKQ0KDQphZnJvY250cnk8LXVuaXF1ZShhZnJvJGNudHJ5KQ0KbGF0aW5vY250cnk8LXVuaXF1ZShsYXRpbm8yMDEzJGNudHJ5KQ0KYXJhYmNudHJ5PC11bmlxdWUoYXJhYjMkY250cnkpDQp3dnNjbnRyeTwtdW5pcXVlKHd2cyRjbnRyeSkNCg0KY250cnlfdGFibGU8LSBkYXRhLmZyYW1lKGFzLmNoYXJhY3Rlcih3dnNjbnRyeSksDQogICAgICAgICAgICAgICAgICAgICAgICAgYyhhcy5jaGFyYWN0ZXIoYXJhYmNudHJ5KSxyZXAoIi0iLDQ4KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgYyhhcy5jaGFyYWN0ZXIobGF0aW5vY250cnkpLHJlcCgiLSIsNDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihhZnJvY250cnkpLHJlcCgiLSIsMjQpKSkNCg0KY29sbmFtZXMoY250cnlfdGFibGUpIDwtIGMoInd2cyIsImFyYWIiLCJsYXRpbm8iLCJhZnJvIikNCg0KYXJyYW5nZShjbnRyeV90YWJsZSwgd3ZzLCBhZnJvKQ0KDQoNCg0KdGFibGUoY29tYmluZWQkcG9saXRjYXQueCkNCm1wbHVzZGF0YSA8LSBjb21iaW5lZCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cyx3ZWlnaHQpDQptcGx1c2RhdGEgPC0gbmEub21pdChtcGx1c2RhdGEpDQptcGx1c2RhdGEkY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGEkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhLCBwYXRoID0gIm1wbHVzZGF0YS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQptcGx1c2RhdGEyIDwtIGNvbWJpbmVkICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292X3RydXN0LHdlaWdodCkNCm1wbHVzZGF0YTIgPC0gbmEub21pdChtcGx1c2RhdGEyKQ0KbXBsdXNkYXRhMiRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YTIkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhMiwgcGF0aCA9ICJtcGx1c2RhdDJhLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCm1wbHVzZGF0YTJfZGVtIDwtIGNvbWJpbmVkX2RlbSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgZGVtdG9kYXksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3ZfdHJ1c3Qsd2VpZ2h0KQ0KbXBsdXNkYXRhMl9kZW0gPC0gbmEub21pdChtcGx1c2RhdGEyX2RlbSkNCm1wbHVzZGF0YTJfZGVtJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhMl9kZW0kY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhMl9kZW0sIHBhdGggPSAibXBsdXNkYXQyX2RlbWEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KbXBsdXNkYXRhMl9hdXQgPC0gY29tYmluZWRfYXV0ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdl90cnVzdCx3ZWlnaHQpDQptcGx1c2RhdGEyX2F1dCA8LSBuYS5vbWl0KG1wbHVzZGF0YTJfYXV0KQ0KbXBsdXNkYXRhMl9hdXQkY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGEyX2F1dCRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEyX2F1dCwgcGF0aCA9ICJtcGx1c2RhdDJfYXV0YS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyX3MsIGJ5ID0gImNudHJ5IikNCg0KY29tYmluZWRfZGVtIDwtIHN1YnNldChjb21iaW5lZCxjb21iaW5lZCRwb2xpdHlfZGVtZHVtbXk9PTEpDQoNCm1wbHVzZGF0YV9kZW0gPC0gY29tYmluZWRfZGVtICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YV9kZW0gPC0gbmEub21pdChtcGx1c2RhdGFfZGVtKQ0KbXBsdXNkYXRhX2RlbSRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YV9kZW0kY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhX2RlbSwgcGF0aCA9ICJtcGx1c2RhdGFfZGVtLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCg0KY29tYmluZWRfYXV0IDwtIHN1YnNldChjb21iaW5lZCxjb21iaW5lZCRwb2xpdHlfZGVtZHVtbXk9PTApDQoNCm1wbHVzZGF0YV9hdXQgPC0gY29tYmluZWRfYXV0ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCBkZW10b2RheSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfcG9saWNlLHRydXN0X2NvdXJ0cyx3ZWlnaHQpDQptcGx1c2RhdGFfYXV0IDwtIG5hLm9taXQobXBsdXNkYXRhX2F1dCkNCm1wbHVzZGF0YV9hdXQkY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGFfYXV0JGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YV9hdXQsIHBhdGggPSAibXBsdXNkYXRhX2F1dC5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQoNCiNkYXRhX3dpZHMgPC0gZGNhc3QobWVyZ2VkLCBjbnRyeX55ZWFyLCANCiMgICAgICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ5ZWFyIikpDQojZGF0YV93aWRzMiA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseShkYXRhX3dpZHNbLC0xXSxmdW5jdGlvbihuKSAwPG4pKQ0KI2RhdGFfd2lkczMgPC0gYXMuZGF0YS5mcmFtZShhcHBseShkYXRhX3dpZHMyLDIsYXMubnVtZXJpYykpDQojZGF0YV93aWRzMyA8LSBjYmluZChkYXRhX3dpZHNbLDFdLGRhdGFfd2lkczMpDQojbmFtZXMoZGF0YV93aWRzMylbMV08LSJjbnRyeSINCiN0YWJsZV9zdHVmZiA8LSBtZXJnZShkYXRhX3dpZHMzICx0YWJsZV9zdHVmZiwgYnk9ImNudHJ5IikNCg0KI3RhYmxlX3N0dWZmJHBvbGl0eTEwW3RhYmxlX3N0dWZmJGNudHJ5PT0iVHVuaXNpYSJdIDwtIDUuMzIzODINCiN0YWJsZV9zdHVmZjIkcG9saXR5MTBbdGFibGVfc3R1ZmYyJGNudHJ5PT0iVHVuaXNpYSJdIDwtIDUuMzIzODINCg0KaGVhZCh0YWJsZV9zdHVmZikNCmNvcihuYS5vbWl0KGRhdGEuZnJhbWUodGFibGVfc3R1ZmYkbGVnaXQsdGFibGVfc3R1ZmYkbGVnaXQyLHRhYmxlX3N0dWZmJGxlZ2l0MywNCiAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfc3R1ZmYkbWVhbl9nb3YpKSkNCg0KdGFibGVfc3R1ZmYkZ25pIDwtIHRhYmxlX3N0dWZmJGduaV9jDQoNCnRhYmxlX3N0dWZmJGduaV9jW3RhYmxlX3N0dWZmJGduaSA8PSAxMDI1XSA8LSAibG93Ig0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pID4gMTAyNiAmIHRhYmxlX3N0dWZmJGduaSA8PSA0MDM1XSA8LSAibG93ZXItbWlkZGxlIg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pID4gNDAzNiAmIHRhYmxlX3N0dWZmJGduaSA8PSAxMjQ3NV0gPC0gInVwcGVyLW1pZGRsZSINCnRhYmxlX3N0dWZmJGduaV9jW3RhYmxlX3N0dWZmJGduaSA+IDEyNDc1XSA8LSAiaGlnaCINCg0KdGFibGVfc3R1ZmYkZ25pX2MyIDwtIHRhYmxlX3N0dWZmJGduaV9jDQoNCnRhYmxlX3N0dWZmJGduaV9jMlt0YWJsZV9zdHVmZiRnbmlfYyA9PSAibG93ZXItbWlkZGxlIl0gPC0gImxvdyINCnRhYmxlX3N0dWZmJGduaV9jMlt0YWJsZV9zdHVmZiRnbmlfYyA9PSAidXBwZXItbWlkZGxlIl0gPC0gImhpZ2giDQoNCnRhYmxlKHRhYmxlX3N0dWZmJGduaV9jKQ0KdGFibGUodGFibGVfc3R1ZmYkZ25pX2MyKQ0KDQpUaGUgY3V0LW9mZiBwb2ludHMgYXJlIEhESSBvZiBsZXNzIHRoYW4gMC41NTANCmZvciBsb3cgaHVtYW4gZGV2ZWxvcG1lbnQsIDAuNTUwLTAuNjk5IGZvciBtZWRpdW0gaHVtYW4NCmRldmVsb3BtZW50LCAwLjcwMC0wLjc5OSBmb3IgaGlnaCBodW1hbiBkZXZlbG9wbWVudCBhbmQNCjAuODAwIG9yIGdyZWF0ZXIgZm9yIHZlcnkgaGlnaCBodW1hbiBkZXZlbG9wbWVudC4NCg0KI3RhYmxlX3N0dWZmJGhkaV9jIDwtIHRhYmxlX3N0dWZmJGhkaQ0KDQojdGFibGVfc3R1ZmYkaGRpX2NbdGFibGVfc3R1ZmYkaGRpIDwgMC41NTBdIDwtICJsb3ciDQojdGFibGVfc3R1ZmYkaGRpX2NbdGFibGVfc3R1ZmYkaGRpID49IDAuNTUwICYgdGFibGVfc3R1ZmYkaGRpIDw9IDAuNjk5XSA8LSAibWVkaXVtIg0KI3RhYmxlX3N0dWZmJGhkaV9jW3RhYmxlX3N0dWZmJGhkaSA+PSAwLjcwMCAmIHRhYmxlX3N0dWZmJGhkaSA8PSAwLjg5OV0gPC0gImhpZ2giDQojdGFibGVfc3R1ZmYkaGRpX2NbdGFibGVfc3R1ZmYkaGRpID49IDAuOTBdIDwtICJ2ZXJ5IGhpZ2giDQoNCiN0YWJsZSh0YWJsZV9zdHVmZiRoZGlfYykNCg0KDQoNCnRhYmxlKHJvdW5kKHRhYmxlX3N0dWZmJHRlcnJvcikpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292MiA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292MildPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3YzKV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjQgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292NFtpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjQpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NSldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjZbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y2KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjcgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292N1tpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjcpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292OCA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y4W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292OCldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y5IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjlbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y5KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRwaHlzdmlvbDIgPC0gdGFibGVfc3R1ZmYkcGh5c3Zpb2wNCnRhYmxlX3N0dWZmJHBoeXN2aW9sMltpcy5uYSh0YWJsZV9zdHVmZiRwaHlzdmlvbDIpXSA8LSA5OTkNCg0KdGFibGVfc3R1ZmYkdGVycm9yMiA8LSByb3VuZCh0YWJsZV9zdHVmZiR0ZXJyb3IpDQp0YWJsZV9zdHVmZiR0ZXJyb3IyW2lzLm5hbih0YWJsZV9zdHVmZiR0ZXJyb3IyKV0gPC0gOTk5DQoNCnRhYmxlX3N0dWZmJGRpc2N1c3MyIDwtIHJvdW5kKHRhYmxlX3N0dWZmJGRpc2N1c3MqNCkNCnRhYmxlX3N0dWZmJGRpc2N1c3MyW2lzLm5hbih0YWJsZV9zdHVmZiRkaXNjdXNzMildIDwtIDk5OQ0KDQoNCg0KdGFibGUodGFibGVfc3R1ZmYkcGh5c3Zpb2wpDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjUgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC40XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjUgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC40XS01DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjQgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4zXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjQgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4zXS0xMA0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4zICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMl0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4zICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMl0tMTUNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMiAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjFdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMiAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjFdLTIwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjEgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+PTBdICA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjEgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+PTBdICAtMjUNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJG1lYW5fZ292Mj4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjIpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdLTgNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdLTE2DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXS0yNA0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0gLTMyDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjEgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+PTBdIDwtICB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjEgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+PTBdICAtMzANCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJG1lYW5fZ292Mz4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjMpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT01XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09NV0tNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTRdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT00XS0xMA0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTNdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT0zXS0xNQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkbWVhbl9nb3Y0PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NCkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT01XS04DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTRdLTE2DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09M10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTNdLTI0DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiRtZWFuX2dvdjU+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y1KQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gLTUNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRkaXNjdXNzMj09MV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSAtMTANCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJG1lYW5fZ292Nj4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjYpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292N1t0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSAtMTANCnRhYmxlX3N0dWZmJG1lYW5fZ292N1t0YWJsZV9zdHVmZiRkaXNjdXNzMj09MV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSAtMjANCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJG1lYW5fZ292Nz4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjcpDQoNCg0KbG9hZChxb2dfdXJsKQ0KDQpxb2cxMCA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAwIHwNCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDAxIHwgIA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDIgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDAzIHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwNCB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDUgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA2IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwNyB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDggfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA5IHwNCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDEwKQ0KDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KcW9nMTAkY250cnk8LWNvdW50cnljb2RlKHFvZzEwJGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2cxMCRhbF9ldGhuaWM8LWFzLm51bWVyaWMocW9nMTAkYWxfZXRobmljKQ0KI3RpZHlyOjpnYXRoZXIocW9nMTAsYygiY250cnkiLCJ5ZWFyIiksImFsX2V0aG5pYyIpDQoNCnFvZzEwYSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGFsX2V0aG5pYykgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTcgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiYWxfZXRobmljIiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQojcW9nMTBoZGkgPC0gcW9nMTAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcix1bmRwX2hkaSkgJT4lDQojICBhcy5kYXRhLmZyYW1lKCkNCiNkYXRhX3dpZGVfaGRpIDwtIGhkaQ0KICAjcmVzaGFwZShkYXRhID0gcW9nMTBoZGksDQogICAgICAgICAgICAgICAgICAgICAgIyBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIyB2Lm5hbWVzID0gInVuZHBfaGRpIiwNCiAgICAgICAgICAgICAgICAgICAgICAjIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIyBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCg0KDQp0YWJsZShxb2ckYWxfZXRobmljLHFvZyR5ZWFyKQ0KDQpxb2cxNCA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDE0KQ0KcW9nMTQkY250cnk8LWNvdW50cnljb2RlKHFvZzE0JGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2cxNCA8LSBxb2cxNCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGNzcGZfbGVnaXQpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmRhdGFfd2lkZTE4IDwtIHJlc2hhcGUoZGF0YSA9IHFvZzE0LA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiY3NwZl9sZWdpdCIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KcW9nMTUgPC0gc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxNSkNCnFvZzE1JGNudHJ5PC1jb3VudHJ5Y29kZShxb2cxNSRjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KcW9nMTUgPC0gcW9nMTUgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixmZnBfc2wpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmRhdGFfd2lkZTE5IDwtIHJlc2hhcGUoZGF0YSA9IHFvZzE1LA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiZmZwX3NsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQoNCnFvZzEwJGNpcmlfcGh5c2ludDwtYXMubnVtZXJpYyhxb2cxMCRjaXJpX3BoeXNpbnQpDQpxb2cxMGEgPC0gcW9nMTAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixjaXJpX3BoeXNpbnQpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmRhdGFfd2lkZTIwIDwtIHJlc2hhcGUoZGF0YSA9IHFvZzEwYSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWR2YXIgPSAiY250cnkiLA0KICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gImNpcmlfcGh5c2ludCIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KcW9nMTAkZ2RfcHRzcyA8LWFzLm51bWVyaWMocW9nMTAkZ2RfcHRzcykNCnFvZzEwYSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGdkX3B0c3MpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmRhdGFfd2lkZTIxIDwtIHJlc2hhcGUoZGF0YSA9IHFvZzEwYSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWR2YXIgPSAiY250cnkiLA0KICAgICAgICAgICAgICAgICAgICAgICB2Lm5hbWVzID0gImdkX3B0c3MiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCnFvZzE0PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDE0KQ0KcW9nMTM8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTMpDQpxb2cxMjwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMikNCnFvZzExPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDExKQ0KcW9nMTA8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTApDQpxb2c4PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA4KQ0KcW9nNzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwNykNCnFvZzY8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDYpDQpxb2c1PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA1KQ0KcW9nNDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwNCkNCnFvZzM8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDMpDQpxb2cyPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAyKQ0KcW9nMTwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMSkNCnFvZzA8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDApDQoNCg0KDQp0YWJsZShpcy5uYShxb2ckd2VsX2N1bHR1cmUpLHFvZyR5ZWFyKQ0KY3VscmVnPC0gcG1heChxb2cxNCR3ZWxfY3VsdHVyZSwgcW9nMTMkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxMiR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzExJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMTAkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c4JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nNyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzYkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c1JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nNCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzMkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cyJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMSR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzAkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIGFzLmNoYXJhY3Rlcihzam1pc2M6OnRvX2xhYmVsKGN1bHJlZykpDQpjdWxyZWc8LWFzLmRhdGEuZnJhbWUoY2JpbmQoY3VscmVnLHFvZzE0JGNjb2RlY293KSkNCm9yZWFzdCAgPC0gc3Vic2V0KGN1bHJlZywgY3VscmVnJGN1bHJlZyA9PSAiT3J0aG9kb3ggRWFzdCIpDQpvcmVhc3QNCg0KI2N1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KDQpxb2cxNCRodF9yZWdpb24gDQoNCmN1bHJlZyRjbnRyeTwtY291bnRyeWNvZGUoY3VscmVnJFYyLCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQp0YWJlbGV0dG88LW1lcmdlKHRhYmxlX3N0dWZmLGN1bHJlZyxieT0iY250cnkiKQ0KdGFiZWxldHRvPC1hcy5kYXRhLmZyYW1lKGNiaW5kKHRhYmxlX3N0dWZmJHJlZ2lvbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHRhYmxlX3N0dWZmJGNudHJ5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodGFiZWxldHRvJGN1bHJlZykpKQ0KdGFiZWxldHRvIDwtIHRhYmVsZXR0b1tvcmRlcih0YWJlbGV0dG8kVjEsIHRhYmVsZXR0byRWMyksXQ0KI2VkaXQodGFiZWxldHRvKQ0KDQpjdWxyZWc8LWRhdGEuZnJhbWUoY2JpbmQodGFiZWxldHRvLGN1bHJlZykpDQpjdWxyZWc8LWN1bHJlZ1ssYygyLDQpXQ0KbmFtZXMoY3VscmVnKVsxXTwtYygiY250cnkiKQ0KDQp0YWJsZV9zdHVmZjMgPC0gbWVyZ2UodGFibGVfc3R1ZmYsY3VscmVnLGJ5PSJjbnRyeSIpDQoNCnRhYmxlKGFzLmNoYXJhY3Rlcih0YWJlbGV0dG8kVjMpKQ0KDQpxb2cxMDAgPC0gc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMCkNCnFvZzEwMCRjbnRyeTwtY291bnRyeWNvZGUoc2ptaXNjOjp0b19sYWJlbChxb2cxMDAkY2NvZGVjb3cpLCAiY293biIsImNvdW50cnkubmFtZS5lbiIpDQpxb2cxMDAgPC0gcW9nMTAwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsaHRfcmVndHlwZTEpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCnFvZzEwMCRyZWd0eXBlPC1zam1pc2M6OnRvX2xhYmVsKHFvZzEwMCRodF9yZWd0eXBlMSkNCnFvZzEwMCR5ZWFyIDwtIE5VTEwNCnFvZzEwMCRodF9yZWd0eXBlMSA8LSBOVUxMDQp0YWJsZShxb2cxMDAkcmVndHlwZSkNCg0KDQpldGhuaWMxMDwtYXMubnVtZXJpYyhyb3dNZWFucyhkYXRhX3dpZGUxN1ssMjoxMl0pKSAjIG1lYW4gb3ZlciBsYXN0IDEwIHllYXJzICgyMDAwIC0gMjAxMCkNCnBoeXNpbnQxMDwtYXMubnVtZXJpYyhyb3dNZWFucyhkYXRhX3dpZGUyMFssMjoxMl0pKSAjIG1lYW4gb3ZlciBsYXN0IDEwIHllYXJzICgyMDAwIC0gMjAxMCkNCnRlcnJvcjEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTIxWywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KbGVnaXQ8LWFzLm51bWVyaWMoZGF0YV93aWRlMThbLDJdKSAjIG1lYW4gb3ZlciBsYXN0IDEwIHllYXJzICgyMDAwIC0gMjAxMCkNCmxlZ2l0MjwtYXMubnVtZXJpYyhkYXRhX3dpZGUxOVssMl0pICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KcW9ndGhpbmd5PC1kYXRhLmZyYW1lKGRhdGFfd2lkZTE5WywxXSxldGhuaWMxMCxsZWdpdCxsZWdpdDIscGh5c2ludDEwLHRlcnJvcjEwKQ0KY29sbmFtZXMocW9ndGhpbmd5KVsxXTwtYygiY250cnkiKQ0KcW9ndGhpbmd5PC1tZXJnZSh4PXFvZ3RoaW5neSwgeT1xb2cxMDAsIGJ5PSJjbnRyeSIpDQoNCiNxb2d0aGluZ3k8LWRhdGEuZnJhbWUoZGF0YV93aWRlMTdbLDFdLGV0aG5pYzEwKQ0KI2NvbG5hbWVzKHFvZ3RoaW5neSlbMV08LWMoImNudHJ5IikNCiNjb21iaW5lZCA8LSBtZXJnZSh4PXFvZ3RoaW5neSwgeT1jb21iaW5lZCwgYnk9ImNudHJ5IikNCg0KDQpxb2dfY3MgPC1yZWFkX3Nwc3MoIkM6L1VzZXJzL0Zhdm9uZS9Eb3dubG9hZHMvcW9nX3N0ZF9jc19qYW4xNy5zYXYiKSAjbG9hZGluZyBkYXRhc2V0DQpxb2dfY3MkY250cnk8LWNvdW50cnljb2RlKHFvZ19jcyRjY29kZWNvdywgImNvd24iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KcW9nX2NzJGxlZ2l0MzwtYXMubnVtZXJpYyhxb2dfY3MkZ292X2l4bGVnaXRpbWFjeWluZGV4KQ0KDQpsZWdpdF9kYXQ8LWRhdGEuZnJhbWUocW9nX2NzJGNudHJ5LHFvZ19jcyRsZWdpdDMpDQpjb2xuYW1lcyhsZWdpdF9kYXQpPC1jKCJjbnRyeSIsImxlZ2l0MyIpDQoNCmFnZ3JkZWxpYiA8LSBtZXJnZSh4PWxlZ2l0X2RhdCwgeT1hZ2dyZGVsaWIsIGJ5PSJjbnRyeSIpDQoNCmFnZ3JkZWxpYiRsZWdpdDMgPC0gcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQzKQ0KY29yKG5hLm9taXQoYWdncmRlbGliWyxjKDQsNSw3LDEzKV0pKQ0KY29yKG5hLm9taXQoYWdncmRlbGliWyxjKDQsNSwyLDY6MTMpXSkpDQoNCmFnZ3JkZWxpYiRsZWdpdCA8LSAxLXJhbmdlMDEoYWdncmRlbGliJGxlZ2l0KQ0KYWdncmRlbGliJGxlZ2l0MiA8LSAxLXJhbmdlMDEoYWdncmRlbGliJGxlZ2l0MikNCmFnZ3JkZWxpYiRhc2lhIDwtIGFnZ3JkZWxpYiRlLmFzaWEgKyBhZ2dyZGVsaWIkcy5lLmFzaWEgKyBhZ2dyZGVsaWIkcy5hc2lhICsgYWdncmRlbGliJHBhY2lmaWMNCg0KU0ZJIDwtcmVhZF9zcHNzKCJDOi9Vc2Vycy9GYXZvbmUvRG93bmxvYWRzL1NGSXYyMDE2LnNhdiIpICNsb2FkaW5nIGRhdGFzZXQNClNGSSA8LSBzdWJzZXQoU0ZJLFNGSSR5ZWFyPT0yMDE1KQ0KU0ZJJGNudHJ5IDwtY291bnRyeWNvZGUoU0ZJJGNvdW50cnksICJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKSANClNGSSRjbnRyeVs3OV0gPC0gIk5vcnRoIEtvcmVhIg0KU0ZJJGNudHJ5IDwtY291bnRyeWNvZGUoU0ZJJGNudHJ5LCAiY291bnRyeS5uYW1lLmVuIiwiY291bnRyeS5uYW1lLmVuIikgDQpTRkkkbGVnaXRpbWFjeSA8LSBTRkkkbGVnaXQNClNGSSRsZWdpdCA8LSBOVUxMDQoNCg0KYWdncmRlbGliIDwtIG1lcmdlKHg9U0ZJLCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCg0KaGRpIDwtIHJlYWRfY3N2KCJoZGkuY3N2IikNCmhkaSRjbnRyeTwtY291bnRyeWNvZGUoaGRpJENvdW50cnksICJjb3VudHJ5Lm5hbWUuZW4iLCJjb3VudHJ5Lm5hbWUuZW4iKQ0KaGRpJCcxOTkwJzwtIE5VTEwgOyBoZGkkJzE5OTEnPC0gTlVMTCA7IGhkaSQnMTk5Mic8LSBOVUxMIDsgaGRpJCcxOTkzJzwtIE5VTEwNCmhkaSQnMTk5NCc8LSBOVUxMOyBoZGkkJzE5OTUnPC0gTlVMTDsgaGRpJCcxOTk2JzwtIE5VTEw7IGhkaSQnMTk5Nyc8LSBOVUxMDQpoZGkkJzE5OTgnPC0gTlVMTCA7IGhkaSQnMTk5OSc8LSBOVUxMIDsgaGRpJCcyMDExJzwtIE5VTEwgOyBoZGkkJzIwMTInPC0gTlVMTA0KaGRpJCcyMDEzJzwtIE5VTEw7IGhkaSQnMjAxNCc8LSBOVUxMOyBoZGkkJzIwMTUnPC0gTlVMTDtoZGkkYEhESSBSYW5rICgyMDE1KWA8LSBOVUxMDQpoZGkkQ291bnRyeTwtIE5VTEwNCmhkaTEwPC1hcy5udW1lcmljKHJvd01lYW5zKGhkaVssMToxMV0pKSANCmhkYXQ8LWRhdGEuZnJhbWUoaGRpJGNudHJ5LGhkaTEwKSANCm5hbWVzKGhkYXQpPC1jKCJjbnRyeSIsImhkaTEwIikNCg0KYWdncmRlbGliIDwtIG1lcmdlKHg9aGRhdCwgeT1hZ2dyZGVsaWIsIGJ5PSJjbnRyeSIpDQojdGFibGUoYWdncmRlbGliJGhkaTEwKQ0KI2djKCkNCiNjb21iaW5lZCA8LSBtZXJnZSh4PWhkYXQsIHk9Y29tYmluZWQsIGJ5PSJjbnRyeSIpDQoNCg0KI2NvbG5hbWVzKGFnZ3JkZWxpYilbOV08LSJlX3BfcG9saXR5Ig0KI2xvcDwtc3Vic2V0KHZkZW1zX3N0YXJ0LHZkZW1zX3N0YXJ0JHllYXI9PTIwMTApDQoNCmNvcihuYS5vbWl0KGFnZ3JkZWxpYjJbLDI6MTddKSkNCmNvcihuYS5vbWl0KGRhdGEuZnJhbWUoYWdncmRlbGliJHBvbGl0eTEwLGFnZ3JkZWxpYiRkZWxpYjEwKSkpDQoNCiNoaXN0KHZkZW1zJHYyZGxjb25zbHQpDQojaGlzdCh2ZGVtcyR2MnhjbF9kaXNjKQ0KI3RhYmxlKHZkZW1zX3N0YXJ0JGVfYm9peF9yZWdpbWUsdmRlbXNfc3RhcnQkeWVhcikNCiN0YWJsZSh2ZGVtc19zdWIkZV9wX3BvbGl0eSx2ZGVtc19zdWIkeWVhcikNCg0KIyMjIyMgbWVyZ2luZyB0aW1lICMjIyMNCg0KY29tYmluZWQgPC0gbWVyZ2UoeD1tZXJnZWQsIHk9YWdncmRlbGliLCBieT0iY250cnkiKQ0KdGFibGUoY29tYmluZWQkY250cnkpDQoNCmNvbWJpbmVkIDwtIGFzLmRhdGEuZnJhbWUoY29tYmluZWQpDQpjb21iaW5lZCRnb3ZfdHJ1c3QgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRnb3ZfdHJ1c3QpDQpjb21iaW5lZCRhZ2UgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRhZ2UpDQpjb21iaW5lZCRpbmNvbWUgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRpbmNvbWUpDQpjb21iaW5lZCRlZHVjIDwtIGFzLm51bWVyaWMoY29tYmluZWQkZWR1YykNCmNvbWJpbmVkJHNleCA8LSBhcy5mYWN0b3IoY29tYmluZWQkc2V4KQ0KY29tYmluZWQkYXV0aG9yaXRhcmlhbiA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGF1dGhvcml0YXJpYW4pDQpjb21iaW5lZCRzYWZldHkgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRzYWZldHkpDQpjb21iaW5lZCRkZW10b2RheSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGRlbXRvZGF5KQ0KY29tYmluZWQkbGF0aW5vIDwtIGZhY3Rvcihjb21iaW5lZCRsYXRpbm8pDQpjb21iaW5lZCRhZnJvIDwtIGZhY3Rvcihjb21iaW5lZCRhZnJvKQ0KY29tYmluZWQkYW1lcmljYXMgPC0gZmFjdG9yKGNvbWJpbmVkJGFtZXJpY2FzKQ0KY29tYmluZWQkYXNpYSA8LSBjb21iaW5lZCRlLmFzaWEgKyBjb21iaW5lZCRzLmUuYXNpYSArIGNvbWJpbmVkJHMuYXNpYSArIGNvbWJpbmVkJHBhY2lmaWMNCg0KY29yKG5hLm9taXQoZGF0YS5mcmFtZShjb21iaW5lZCRnb3ZfdHJ1c3QsY29tYmluZWQkaW5jb21lLGNvbWJpbmVkJGVkdWMsICNTb2Npb2Vjb25vbWljIGZhY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWQkZGVsaWIxMCwgY29tYmluZWQkcG9saXR5MTAsIGNvbWJpbmVkJGdkcDEwLCBjb21iaW5lZCRkZW10b2RheSkpKQ0KDQpjb21iaW5lZCRjbnRyeTwtYXMuZmFjdG9yKGNvbWJpbmVkJGNudHJ5KQ0KDQoNCiNjb21iaW5lZCRwb2xpdHkxMCA8LSBjb21iaW5lZCRwb2xpdHkxMCoyMC0xMA0KDQojY29tYmluZWQkcmVnaW1lIDwtIGNvbWJpbmVkJHBvbGl0eTEwDQojY29tYmluZWQkcmVnaW1lW2NvbWJpbmVkJHBvbGl0eV9hdXRvZHVtbXk9PTFdIDwtICJhdXRvIg0KI2NvbWJpbmVkJHJlZ2ltZVtjb21iaW5lZCRwb2xpdHlfYW5vZHVtbXk9PTFdIDwtICJhbm8iDQojY29tYmluZWQkcmVnaW1lW2NvbWJpbmVkJHBvbGl0eV9kZW1kdW1teT09MV0gPC0gImRlbW8iDQoNCmhpc3QoY29tYmluZWQkZ292X3RydXN0KQ0KcXBsb3QoY29tYmluZWQkZ292X3RydXN0KQ0KDQpjb21iaW5lZCRjbnRyeQ0KDQoNCg0KI3BoeXNpX3MgPC0gdmRlbXNfc3ViMiAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIGZyYW56KQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpX3MsIGJ5ID0gImNudHJ5ZWFycyIpDQoNCiNwaHlzaTJfcyA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQojICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxwb2xpdGNhdD1tZWFuKGZyYW56LG5hLnJtPVQpKQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMl9zLCBieSA9ICJjbnRyeSIpDQoNCg0KdmRlbXNfc3ViMiRjbnRyeWVhcnMgPC0gcGFzdGUodmRlbXNfc3ViMiRjbnRyeSx2ZGVtc19zdWIyJHllYXIpDQoNCnBoeXNpIDwtIHZkZW1zX3N1YjIgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBwZXJjKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2ksIGJ5ID0gImNudHJ5ZWFycyIpDQoNCnBoeXNpMiA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UscGh5c3Zpb2w9bWVhbihwZXJjLG5hLnJtPVQpKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyLCBieSA9ICJjbnRyeSIpDQoNCg0KDQoNCg0KI3BoeXNpXzIyJGRpczMgPC1yb3VuZChwaHlzaV8yMiRkaXMyKQ0KDQojdW5pcXVlKHBoeXNpMl9zJGNudHJ5KQ0KDQojMS0yLjUNCiMzLTUNCiM1LjUgLSA3DQojcGh5c2kyX3MkcG9saXRjYXQyPC04LSgocGh5c2kyX3MkcG9saXRjYXQpICogKDcvMTApKQ0KIzExIA0KDQojcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15IDwtIHBoeXNpMl9zJHBvbGl0Y2F0Mg0KI3BoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSBbcGh5c2kyX3MkcG9saXRjYXQyIDw9IDIuNV0gPC0gMQ0KI3BoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSBbcGh5c2kyX3MkcG9saXRjYXQyID4gIDIuNV0gPC0gMA0KI3RhYmxlKHBoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSkNCg0KI3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teSA8LSBwaHlzaTJfcyRwb2xpdGNhdDINCiNwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyID4gMi41ICYgcGh5c2kyX3MkcG9saXRjYXQyIDwgNS41XSA8LSAxDQojcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA8PSAyLjUgfCBwaHlzaTJfcyRwb2xpdGNhdDIgPj0gNS41XSA8LSAwDQojdGFibGUocGh5c2kyX3MkcG9saXR5X2Fub2R1bW15KQ0KDQojcGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teSA8LSBwaHlzaTJfcyRwb2xpdGNhdDINCiNwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA+PSA1LjVdIDwtIDENCiNwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA8IDUuNV0gPC0gMA0KI3RhYmxlKHBoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXkpDQoNCiNwaHlzaTJfcyRyZWdpbWUgPC0gcGh5c2kyX3MkcG9saXRjYXQNCiNwaHlzaTJfcyRyZWdpbWVbcGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teT09MV0gPC0gImF1dG8iDQojcGh5c2kyX3MkcmVnaW1lW3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teT09MV0gPC0gImFubyINCiNwaHlzaTJfcyRyZWdpbWVbcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15PT0xXSA8LSAiZGVtbyINCg0KI3VuaXF1ZShwaHlzaTJfcyRjbnRyeSkNCg0KdGFibGUocGh5c2kyX3MkcmVnaW1lKQ0KDQpxb2cyMDAwIDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTAgfA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMSB8ICANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTIgfCANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTMgfCANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTQgfCANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTUpDQoNCnRhYmxlKHFvZzIwMDAkZ2RfcHRzYSxxb2cyMDAwJHllYXIpDQoNCnFvZzIwMDAkcGVyYzIgPC0gcW9nMjAwMCRnZF9wdHNhDQoNCnFvZzIwMDAkY250cnk8LWNvdW50cnljb2RlKHFvZzIwMDAkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lLmVuIikNCg0KcW9nMjAwMCRjbnRyeWVhcnMgPC0gcGFzdGUocW9nMjAwMCRjbnRyeSxxb2cyMDAwJHllYXIpDQoNCnBoeXNpMjAwMCA8LSBxb2cyMDAwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgcGVyYzIpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTIwMDAsIGJ5ID0gImNudHJ5ZWFycyIpDQoNCnBoeXNpMjIwMDAgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZSx0ZXJyb3I9bWVhbihwZXJjMixuYS5ybT1UKSkNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMjIwMDAsIGJ5ID0gImNudHJ5IikNCg0KI3RhYmxlKHFvZzIwMDAkdW5kcF9oZGkscW9nMjAwMCR5ZWFyKQ0KDQojcGh5c2lmZiA8LSBxb2cyMDAwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgdW5kcF9oZGkpDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lmZiwgYnkgPSAiY250cnllYXJzIikNCg0KI3BoeXNpZmYyIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiMgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxoZGk9bWVhbih1bmRwX2hkaSxuYS5ybT1UKSkNCg0KI2NvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWZmMiwgYnkgPSAiY250cnkiKQ0KDQoNCmduaSA8LSByZWFkX2NzdigiR05JLmNzdiIsICBza2lwID0gMSkNCg0KZ25pJGAyMDE1YDwtZ3N1YigidHR0IiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YDwtZ3N1YigiZmYiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJzc3MiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJ1dXUiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJvIiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YCA8LSBhcy5udW1lcmljKGduaSRgMjAxNWApDQoNCmduaSRgMjAxNGA8LWdzdWIoInR0dCIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGA8LWdzdWIoImZmIiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1Yigic3NzIiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1YigidXV1IiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1YigibyIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGAgPC0gYXMubnVtZXJpYyhnbmkkYDIwMTRgKQ0KDQpnbmk8LWduaVssYygyLDIzOjI4KV0NCg0KZ25pPC1nYXRoZXIoYXMuZGF0YS5mcmFtZShnbmkpLGtleSA9ICJDb3VudHJ5IikNCm5hbWVzKGduaSkgPC0gYygiY250cnkiLCJ5ZWFyIiwiZ25pIikNCg0KZ25pJGNudHJ5PC1jb3VudHJ5Y29kZShnbmkkY250cnksImNvdW50cnkubmFtZS5lbiIsImNvdW50cnkubmFtZS5lbiIpDQpnbmkkY250cnllYXJzIDwtIHBhc3RlKGduaSRjbnRyeSxnbmkkeWVhcikNCg0KcGh5c2lnbmkgPC0gZ25pICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgZ25pKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lnbmksIGJ5ID0gImNudHJ5ZWFycyIpDQoNCnBoeXNpZ25pMiA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxnbmlfYz1tZWFuKGduaSxuYS5ybT1UKSkNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpZ25pMiwgYnkgPSAiY250cnkiKQ0KDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==